String zu Byte Array in UTF-8?

7

Wie konvertiert man einen WideString (oder einen anderen langen String) in Byte-Array in UTF-8?

    
Mariusz 08.03.2011, 14:01
quelle

6 Antworten

11

Eine Funktion wie diese wird tun, was Sie brauchen:

%Vor%

Sie können es mit jeder Art von Zeichenfolge aufrufen, und RTL konvertiert die Codierung der Zeichenfolge, die an UTF-8 übergeben wird. Lassen Sie sich also nicht dazu verleiten zu denken, dass Sie vor dem Aufruf in UTF-8 konvertieren müssen, übergeben Sie einfach eine beliebige Zeichenfolge und lassen Sie die RTL die Arbeit machen.

Danach ist es eine ziemlich normale Array-Kopie. Beachten Sie die Assertion, die explizit die Annahme der Stringelementgröße für eine UTF-8-codierte Zeichenfolge aufruft.

Wenn Sie den Null-Terminator erhalten möchten, würden Sie es so schreiben:

%Vor%     
David Heffernan 08.03.2011, 14:20
quelle
8

Sie können TEncoding.UTF8.GetBytes in SysUtils.pas

verwenden     
Mikael Eriksson 08.03.2011 14:53
quelle
5

Wenn Sie Delphi 2009 oder höher (die Unicode-Versionen) verwenden, ist das Konvertieren eines WideString in einen UTF8String eine einfache Zuweisungsanweisung:

%Vor%

Der Compiler wird die richtige Bibliotheksfunktion aufrufen, um die Konvertierung durchzuführen, da er weiß, dass Werte vom Typ UTF8String eine "Codepage" von CP_UTF8 haben.

In Delphi 7 und höher können Sie die mitgelieferte Bibliotheksfunktion Utf8Encode verwenden. Für noch frühere Versionen können Sie diese Funktion von anderen Bibliotheken wie der JCL abrufen.

Sie können auch Ihre eigene Konvertierungsfunktion mit der Windows-API schreiben:

%Vor%

In vielen Fällen können Sie einfach einen UTF8String als Array verwenden, aber wenn Sie wirklich ein Byte-Array benötigen, können Sie die Funktionen von David und Cosmin verwenden. Wenn Sie eine eigene Zeichenumwandlungsfunktion schreiben, können Sie den UTF8String überspringen und direkt zu einem Byte-Array wechseln. Ändere einfach den Rückgabetyp auf TBytes oder array of Byte . (Sie können auch die Länge um eins erhöhen, wenn das Array null-terminiert sein soll. SetLength führt das implizit zur Zeichenfolge, aber zu einem Array.)

Wenn Sie einen anderen Stringtyp haben, der weder WideString, UnicodeString noch UTF8String ist, konvertieren Sie ihn zunächst in WideString oder UnicodeString und konvertieren ihn dann zurück in UTF-8 / p>     

Rob Kennedy 08.03.2011 15:01
quelle
4
%Vor%

Je nachdem, wofür Sie die Bytes benötigen, können Sie einen NULL-Terminator verwenden.

Stellen Sie für Produktionscode sicher, dass Sie auf leere Zeichenfolge testen. Das Hinzufügen der 3-4 LOC würde die Probe nur schwerer lesbar machen.

    
Cosmin Prund 08.03.2011 14:09
quelle
1

Ich habe die folgenden zwei Routinen (Quelltext kann hier heruntergeladen werden - Ссылка ):

Funktion CsiBytesToStr (const pInData: TByteDynArray; pStringEncoding: TECsiStringEncoding; pIncludesBom: Boolean): string;

Funktion CsiStrToBytes (const pInStr: Zeichenfolge; pStringEncoding: TECsiStringEncoding;  pIncludeBom: Boolean): TByteDynArray;

    
Misha 08.03.2011 23:51
quelle
0

widestring - & gt; UTF8:

Ссылка

das Gegenteil:

Ссылка

Beachten Sie, dass die Zuweisung eines Widestrings zu einem Ansingestring in einem System vor D2009 (einschließlich des aktuellen freien Pascal) in die lokale ansi-Codierung, Verstümmelungszeichen konvertiert wird.

Für den TBytes-Teil, siehe die Bemerkung von Rob Kennedy oben.

    
Marco van de Voort 09.03.2011 12:57
quelle

Tags und Links