Преобразование 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 ответов:
Если вы не хотите использовать ICU,
- Windows: WideCharToMultiByte
- Linux: iconv (Glibc)
Измените кодировку на UTF-8 С помощью PowerShell:
powershell -Command "Get-Content PATH\temp.txt -Encoding Unicode | Set-Content -Encoding UTF8 PATH2\temp.txt"
Я тоже столкнулся с этой проблемой, я решаю ее с помощью 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 , которая является библиотекой только для заголовков.