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?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top