Конвертировать UTF-16 в UTF-8 под Windows и Linux, в C - PullRequest
24 голосов
/ 19 мая 2010

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

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

Кто-нибудь может порекомендовать метод, который будет «перекрестным», и если вы знаете ссылки или руководство с образцами, был бы очень признателен.

Спасибо, Doori Bar

Ответы [ 7 ]

6 голосов
/ 20 мая 2010

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

  1. Windows: WideCharToMultiByte
  2. Linux: iconv (Glibc)
6 голосов
/ 11 марта 2015

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

powershell -Command "Get-Content PATH\temp.txt -Encoding Unicode | Set-Content -Encoding UTF8 PATH2\temp.txt"
5 голосов
/ 04 декабря 2013

Я тоже столкнулся с этой проблемой, я решаю ее с помощью 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, убедитесь, что кодировка правильная -8859-1). * * +1010

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

5 голосов
/ 19 мая 2010

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

4 голосов
/ 20 мая 2010
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);
2 голосов
/ 12 октября 2012

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

0 голосов
/ 20 мая 2010

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

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

Вот и все.

...