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?

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top