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?

Foi útil?

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:

  1. mudanças conhost Windows Subsistema para Linux utiliza a página de código 65001 para seus consoles. Também é possível executar chcp 65001 em cmd.exe desde WSL. (Ele tem causado alguma erros Python muito burro .)
  2. 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.

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