Преобразование UTF-16 в UTF-8 под Windows и Linux, в C


Мне было интересно, существует ли рекомендуемый метод "кросс" Windows и Linux для преобразования строк из UTF-16LE в UTF-8? или следует использовать разные методы для каждой среды?

Мне удалось найти в google несколько ссылок на 'iconv', но для somreason я не могу найти примеры основных преобразований, таких как - преобразование wchar_t UTF-16 в UTF-8.

Любой может порекомендовать метод, который был бы "перекрестным", и если вы знаете ссылки или руководство с образцами, буду очень признателен.

Спасибо, Doori Bar

7 22

7 ответов:

Если вы не хотите использовать ICU,

  1. Windows: WideCharToMultiByte
  2. Linux: iconv (Glibc)

Измените кодировку на UTF-8 С помощью PowerShell:

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

Библиотека ICU с открытым исходным кодом используется очень часто.

Я тоже столкнулся с этой проблемой, я решаю ее с помощью 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;
}

Функцияboost::locale::conv::utf_to_utf пытается преобразовать из буфера, закодированного UTF-16LE, в UTF-8, Функция boost:: locale:: conv:: from_utf пытается преобразовать буфер, закодированный UTF-8 в ANSI, убедитесь, что кодировка правильная(здесь я использую кодировку для Latin-1, ISO-8859-1).

Еще одно напоминание: в Linux std:: wstring имеет длину 4 байта, но в Windows std:: wstring имеет длину 2 байта, поэтому лучше не использовать std::wstring для хранения буфера UTF-16LE.

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);

Существует также utfcpp , которая является библиотекой только для заголовков.

Спасибо, ребята, вот как мне удалось решить "перекрестное" требование windows и linux:

  1. загружено и установлено: MinGW, и MSYS
  2. скачал исходный пакет libiconv
  3. скомпилировано libiconv через MSYS.

Вот и все.