it-swarm.dev

Converta UTF-16 para UTF-8 no Windows e Linux, em C

Eu queria saber se há um método recomendado 'cross' Windows e Linux com a finalidade de converter strings de UTF-16LE para UTF-8? ou deve-se usar métodos diferentes para cada ambiente?

Eu consegui algumas referências ao google 'iconv', mas por alguma razão eu não consigo encontrar amostras de conversões básicas, tais como - converter um wchar_t UTF-16 para UTF-8.

Qualquer um pode recomendar um método que seria 'cross', e se você souber de referências ou um guia com amostras, agradeceria muito.

Obrigado, Doori Bar

23
DooriBar

Obrigado pessoal, foi assim que consegui resolver o requisito de 'cross' windows e linux:

  1. Transferido e instalado: MinGW e MSYS
  2. Transferiu o pacote de fontes libiconv
  3. Compilado libiconv via MSYS.

É sobre isso.

0
DooriBar

Se você não quiser usar o ICU,

  1. Windows: WideCharToMultiByte
  2. Linux: iconv (Glibc)
6
Alex B

Altere a codificação para UTF-8 com o PowerShell: 

powershell -Command "Get-Content PATH\temp.txt -Encoding Unicode | Set-Content -Encoding UTF8 PATH2\temp.txt"
6
user4657497

A biblioteca open source ICU é muito usada.

5
Hans Passant

Eu corri para este problema também, eu resolvo usando boost locale library

try
{           
    std::string utf8 = boost::locale::conv::utf_to_utf<char, short>(
                        (short*)wcontent.c_str(), 
                        (short*)(wcontent.c_str() + wcontent.length()));
    content = boost::locale::conv::from_utf(utf8, "ISO-8859-1");
}
catch (boost::locale::conv::conversion_error e)
{
    std::cout << "Fail to convert from UTF-8 to " << toEncoding << "!" << std::endl;
    break;
}

O boost :: locale :: conv :: utf_to_utf function tenta converter de um buffer codificado por UTF-16LE para UTF-8, O boost :: locale :: conv :: from_utf function tenta converter de um buffer codificado por UTF-8 para ANSI, verifique se a codificação está correta (Aqui eu uso codificação para Latin-1, ISO-8859-1).

Outro lembrete é que, no Linux, std :: wstring tem 4 bytes de comprimento, mas no Windows std :: wstring tem 2 bytes, então é melhor não usar std :: wstring para conter o buffer UTF-16LE.

5
Daniel King
wchar_t *src = ...;
int srclen = ...;
char *dst = ...;
int dstlen = ...;
iconv_t conv = iconv_open("UTF-8", "UTF-16");
iconv(conv, (char*)&src, &srclen, &dst, &dstlen);
iconv_close(conv);
4
Remy Lebeau

Há também utfcpp , que é uma biblioteca somente de cabeçalho.

2
Kevin Smyth