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?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top