2016-03-27 3 views
0

Wenn ich einen UTF-8-codierten Zeichen Array zu erstellen und den Zeiger auf einen String übergeben, wie dieseWas ist System :: String-Konstruktorcodierung?

char buffer[100]; 
CreateMyUTF8EncodedBytes(buffer, "some string with fancy characters like ö"); 
auto s = gcnew String(buffer); 

das meiste davon ist richtig, aber die Nicht-ASCII-Zeichen werden durch Kauderwelsch ersetzt. Ich überprüfte die Pufferdaten doppelt, es ist tatsächlich korrekt, wenn ich den Puffer in ein verwaltetes Array umwandle und es an system :: text :: encoding :: utf8 :: getstring füttere, dann gibt es die korrekte Zeichenkette zurück.

Es ist auch nicht ASCII, wenn ich den Puffer mit einem const Char * Literal füllen, bekomme ich Nicht-ASCII-Werte für einige Zeichen und das Ergebnis ist korrekt.

Also offensichtlich was auch immer der String-Konstruktor zu verarbeiten versucht, ist es nicht UTF8 noch ASCII. Welche Codierung verwendet es? Kann ich es ändern?

Antwort

2

Sie verwenden den String(SByte*) Konstruktor. Es geht davon aus, dass die Bytes gemäß der Systemstandard-Codepage Encoding::Default codiert sind. Während das könnte utf-8 sein, die Chancen dafür sind verschwindend klein, Maschinen kommen nicht aus der Box so. Es hängt davon ab, wo Sie leben, in Westeuropa und Amerika zum Beispiel Code-Seite 1252.

Ja, Sie must Verwendung Encoding :: UTF8 wenn Sie wissen, dass buffer utf-8 kodierten Bytes enthält.

Beachten Sie, dass Sie immer noch nicht so viel über die Codierung für das Zeichenfolgenargument für Ihre CreateMyUTF8EncodedBytes() - Funktion wissen. Das hängt von der Codierung ab, die von Ihrem Texteditor verwandt wird, und der Codierung, die der Compiler erraten hat. UTF-8 mit einer Stückliste zu verwenden ist am besten. UTF-8, so dass Ihr Programm immer noch korrekt kompiliert wird, wenn Ihre Quelldatei tausende Meilen zurücklegt. Und eine Stückliste, damit der Compiler es nicht erraten muss. Wenn Sie VS verwenden, wird dies über Datei> Speichern unter> Pfeil auf der Schaltfläche Speichern> Speichern mit Codierung> wählen Sie "Unicode (UTF-8 mit Signatur)". Beachten Sie, wie CreateMyUTF8EncodedBytes() eine no-op-Funktion macht :)