Apostrofo tipografico + letterale a stringa larga ha rotto il mio wofstream (C ++)
-
03-07-2019 - |
Domanda
Ho appena riscontrato un comportamento strano quando ho a che fare con l'apostrofo tipografico minaccioso (''), non con l'apostrofo della macchina da scrivere ('). Utilizzato con letterale a stringa larga, l'apostrofo rompe il flusso.
Questo codice funziona
ofstream file("test.txt");
file << "A’B" ;
file.close();
== > A'B
Questo codice funziona
wofstream file("test.txt");
file << "A’B" ;
file.close();
== > A'B
Questo codice ha esito negativo
wofstream file("test.txt");
file << L"A’B" ;
file.close();
== > A
Questo codice non riesce ...
wstring test = L"A’B";
wofstream file("test.txt");
file << test ;
file.close();
== > A
Qualche idea?
Soluzione
Dovresti " abilitare " impostazioni locali prima di utilizzare wofstream:
std::locale::global(std::locale()); // Enable locale support
wofstream file("test.txt");
file << L"A’B";
Quindi, se si dispone della locale di sistema en_US.UTF-8
, il file test.txt
includerà
Dati codificati utf8 (4 byte), se si dispone della locale di sistema en_US.ISO8859-1
, la codifica come codifica a 8 bit (3 byte), a meno che ISO 8859-1 non manchi tale carattere.
wofstream file("test.txt");
file << "A’B" ;
file.close();
Questo codice funziona perché " A & # 8217; B "
è in realtà una stringa utf-8 e si salva utf-8
stringa per file byte per byte.
Nota: suppongo che tu stia utilizzando POSIX come SO e che tu abbia impostazioni internazionali predefinite diverse da " C " questa è la locale predefinita.
Altri suggerimenti
Sei sicuro che non sia il supporto del tuo compilatore per i caratteri unicode nei file sorgente che è "rotto"? Cosa succede se si utilizza \ x
o simile per codificare il carattere nella stringa letterale? Il tuo file sorgente è anche in qualunque codifica potrebbe essere un wchar_t
per il tuo compilatore?
Prova a racchiudere il carattere di inserimento dello stream in un blocco try-catch
e dicci quale, se del caso, genera un'eccezione.
Non sono sicuro di cosa stia succedendo qui, ma molesterò comunque un'ipotesi. L'apostrofo tipografico ha probabilmente un valore che si adatta a un byte. Funziona con " A’B "
poiché copia ciecamente byte senza preoccuparsi della codifica sottostante. Tuttavia, con L " A’B "
, entra in gioco un fattore di codifica dipendente dall'implementazione. Probabilmente non trova il valore UTF-16 corretto (se sei su Windows) o UTF-32 (se sei su * nix / Mac) da memorizzare per questo particolare personaggio.