Typografische Apostroph + breite Stringliteral brach mein wofstream (C ++)
-
03-07-2019 - |
Frage
Ich habe ein seltsames Verhalten nur auftreten, wenn mit dem ominösen typographischen Apostroph (‘), die sich - nicht die Schreibmaschine Apostroph ( '). Wird mit breiten Stringliteral, wofstream die Apostroph bricht.
Dieser Code funktioniert
ofstream file("test.txt");
file << "A’B" ;
file.close();
==> A'B
Dieser Code funktioniert
wofstream file("test.txt");
file << "A’B" ;
file.close();
==> A'B
Dieser Code schlägt fehl
wofstream file("test.txt");
file << L"A’B" ;
file.close();
==> A
Dieser Code schlägt fehl ...
wstring test = L"A’B";
wofstream file("test.txt");
file << test ;
file.close();
==> A
Jede Idee?
Lösung
Sie sollten "enable" locale vor der Verwendung wofstream:
std::locale::global(std::locale()); // Enable locale support
wofstream file("test.txt");
file << L"A’B";
Also, wenn Sie Systemgebietsschema en_US.UTF-8
haben, dann wird die Datei test.txt
enthalten
utf8 codierten Daten (4 byes), wenn Sie System locale en_US.ISO8859-1
haben, dann wäre es sie als 8-Bit-Codierung (3 Byte) codieren, es sei denn, ISO 8859-1 Misses solchen Charakter.
wofstream file("test.txt");
file << "A’B" ;
file.close();
Dieser Code funktioniert, weil "A’B"
ist eigentlich utf-8-String und Sie sparen utf-8
String-Byte für Byte Datei.
. Hinweis: Ich nehme an, Sie POSIX wie OS verwenden, und Sie haben Standard-Gebietsschema unterscheidet sich von "C", die die Standard-Locale ist
Andere Tipps
Sind Sie sicher, dass es nicht Ihre Unterstützung des Compilers für Unicode-Zeichen in Quelldateien, die „gebrochen“ ist? Was passiert, wenn Sie verwenden \x
oder ähnlich den Charakter in der Stringliteral zu codieren? Ist die Quelldatei auch in beliebiger Codierung sich, um einen wchar_t
für Ihren Compiler?
Versuchen Sie, die Strom Einfügungszeichen in einem try-catch
Block Einwickeln und sagen uns, was, wenn überhaupt, außer es wirft.
Ich bin nicht sicher, was hier vor sich geht, aber ich werde eine Vermutung sowieso belästigen. Die typografische Apostroph hat wahrscheinlich einen Wert, der in einem Byte entspricht. Dies funktioniert mit "A’B"
, da sie Kopien Bytes blind, ohne sich um die zugrunde liegende Codierung stört. Doch mit L"A’B"
, kommt eine Implementierung abhängige Codierung Faktor ins Spiel. Wahrscheinlich findet nicht den richtigen UTF-16 (wenn Sie unter Windows sind) oder UTF-32 (wenn Sie auf * nichts / Mac) Wert für dieses spezielle Zeichen zu speichern.