apóstrofo tipográfico + ampla literal corda quebrou meu wofstream (C ++)
-
03-07-2019 - |
Pergunta
Eu só encontrei algum comportamento estranho quando se lida com o apóstrofo tipográfica sinistro (’) - não o apóstrofo máquina de escrever ( '). Usado com literal de cadeia larga, as quebras de apóstrofe wofstream.
Este código funciona
ofstream file("test.txt");
file << "A’B" ;
file.close();
==> A'B
Este código funciona
wofstream file("test.txt");
file << "A’B" ;
file.close();
==> A'B
Este código de falha
wofstream file("test.txt");
file << L"A’B" ;
file.close();
==> A
Este código falhar ...
wstring test = L"A’B";
wofstream file("test.txt");
file << test ;
file.close();
==> A
Qualquer idéia?
Solução
Você deve "permitir" locale antes de usar wofstream:
std::locale::global(std::locale()); // Enable locale support
wofstream file("test.txt");
file << L"A’B";
Então, se você tem sistema locale en_US.UTF-8
então o test.txt
arquivo irá incluir
utf8 dados codificados (4) byes, se tiver sistema local en_US.ISO8859-1
, então seria codificá-lo como 8 bits de codificação (3 bytes), a menos que a ISO 8859-1 acidentes tais caracteres.
wofstream file("test.txt");
file << "A’B" ;
file.close();
Este código funciona porque "A’B"
é realmente utf-8 corda e você economizar utf-8
string para byte arquivo byte.
Nota:. Eu suponho que você está usando POSIX como OS, e você tem diferentes localidade padrão de "C", que é a localidade padrão
Outras dicas
Você tem certeza que não é o apoio do seu compilador para caracteres Unicode em arquivos de origem que está "quebrado"? E se você usar \x
ou similar para codificar o personagem no literal de cadeia? É o seu arquivo de origem mesmo em qualquer codificação poder poder a um wchar_t
para o seu compilador?
Tente envolver o caráter de inserção de fluxo em um bloco try-catch
e nos dizer o que, se houver, exceto ele lança.
Eu não sou certo o que está acontecendo aqui, mas eu vou perseguir um palpite de qualquer maneira. A apóstrofo tipográfica, provavelmente, tem um valor que se encaixa em um byte. Isso funciona com "A’B"
uma vez que cegamente cópias bytes sem se preocupar com a codificação subjacente. No entanto, com L"A’B"
, um fator de codificação implementação dependentes entra em jogo. Provavelmente não encontrar o bom UTF-16 (se você estiver no Windows) ou UTF-32 (se você estiver em * nix / Mac) valor à loja para esse caráter particular.