UTF-8 no Windows
Pergunta
Como faço para definir a página de código para UTF-8 em um programa C do Windows?
Eu tenho uma biblioteca de terceiros que tem usos FOPEN para arquivos abertos. Eu posso usar wcstombs para converter meus nomes de arquivo Unicode para a página de código atual, no entanto, se o usuário tem um nome de arquivo com um personagem fora da página de código, em seguida, isso quebra.
O ideal seria apenas chamar _setmbcp (65001) para definir a página de código para UTF-8, no entanto, a documentação do MSDN para _setmbcp afirma que UTF-8 não é suportado.
Como posso resolver isso?
Solução
Infelizmente, não há nenhuma maneira de fazer Unicode página de código atual no Windows. As constantes CP_UTF7
e CP_UTF8
são pseudo-páginas de código, utilizado apenas em MultiByteToWideChar e as funções de conversão WideCharToMultiByte , como Ben mencionado.
Seu problema é semelhante ao das classes fstream C ++. Os construtores fstream aceitar apenas nomes char*
, tornando impossível abrir um arquivo com um nome verdadeiro Unicode. A única solução oferecida pelo VC foi um hack: abra o arquivo separadamente e, em seguida, definir o identificador para o objeto de fluxo. Receio que esta não é uma opção para você, é claro, uma vez que a biblioteca de terceiros, provavelmente não aceita alças.
A única solução que eu posso pensar é criar um arquivo temporário com um nome não-Unicode, que é difícil ligada ao original, e usar isso como um parâmetro.
Outras dicas
APIs todas as janelas pensar em UTF-16, assim que você é melhor escrever um invólucro em torno de sua biblioteca que convertidos nas fronteiras.
Curiosamente, o Windows pensa UTF-8 é uma página de códigos para efeitos de conversão, para que você use as mesmas APIs como faria para converter entre páginas de código:
std::wstring Utf8ToUtf16(const char* u8string)
{
int wcharcount = strlen(u8string);
wchar_t *tempWstr = new wchar_t[wcharcount];
MultiByteToWideChar(CP_UTF8, 0, u8string, -1, tempWstr, wcharcount);
wstring w(tempWstr);
delete [] tempWstr;
return w;
}
E algo de forma semelhante ao converter de volta.
2018 atualização: Windows 10 fez com que o "65001" página de código menos "pseudo" em duas etapas:
- mudanças
conhost
Windows Subsistema para Linux utiliza a página de código 65001 para seus consoles. Também é possível executarchcp 65001
emcmd.exe
desde WSL. (Ele tem causado alguma erros Python muito burro .) - local cheio de recursos: Windows desde construção 17035 permite definir UTF-8 como a localidade de página de código . Isto está disponível a partir da atualização abril 2018.
Use cygwin (que fornece um locale UTF-8 por padrão), ou escreve sua própria corte libc para Windows que faz UTF-16 traduções do necessário UTF-8 para e envolve os fora do padrão _wfopen
etc. funções.