Преобразование строк ISO-8859-1 в UTF-8 в C/С++
Вы считаете, что это будет легко доступно, но мне сложно найти простую библиотечную функцию, которая преобразует строку C или С++ из ISO-8859-1 в UTF-8. Я читаю данные, которые находятся в 8-битной кодировке ISO-8859-1, но нужно преобразовать ее в строку UTF-8 для использования в базе данных SQLite и, в конечном итоге, в приложении для Android.
Я нашел один коммерческий продукт, но в настоящее время он выходит за рамки моего бюджета.
Ответы
Ответ 1
Если ваша исходная кодировка будет всегда соответствовать ISO-8859-1, это тривиально. Здесь цикл:
unsigned char *in, *out;
while (*in)
if (*in<128) *out++=*in++;
else *out++=0xc2+(*in>0xbf), *out++=(*in++&0x3f)+0x80;
Для обеспечения безопасности вам необходимо убедиться, что выходной буфер в два раза больше, чем входной буфер, или же включить ограничение по размеру и проверить его в состоянии цикла.
Ответ 2
В С++ я использую это:
std::string iso_8859_1_to_utf8(std::string &str)
{
string strOut;
for (std::string::iterator it = str.begin(); it != str.end(); ++it)
{
uint8_t ch = *it;
if (ch < 0x80) {
strOut.push_back(ch);
}
else {
strOut.push_back(0xc0 | ch >> 6);
strOut.push_back(0x80 | (ch & 0x3f));
}
}
return strOut;
}
Ответ 3
Стандарт С++ 03 не предоставляет функции прямого преобразования между конкретными кодировками.
В зависимости от вашей ОС вы можете использовать iconv() для Linux, MultiByteToWideChar() и Co в Windows.
Библиотека, которая обеспечивает большую поддержку преобразования строк, - это библиотека ICU, которая является открытым исходным кодом.
Ответ 4
У пользователей Unicode есть таблицы, которые могут помочь, если они столкнулись с Windows 1252 вместо истинного ISO-8859-1. Окончательный, по-видимому, этот, который отображает каждую точку кода в CP1252 в кодовую точку в Юникоде. Кодирование Unicode как UTF-8 - это простое упражнение.
Нетрудно разобрать эту таблицу непосредственно и сформировать из нее во время компиляции таблицу поиска.
Ответ 5
ISO-8859-1 для UTF-8 включает в себя не что иное, как алгоритм кодирования, поскольку ISO-8859-1 является подмножеством Unicode. Таким образом, у вас уже есть коды кода Unicode. Проверьте Википедию для алгоритма.
C++ аспекты - интеграция с iostreams - намного сложнее.
Я предлагаю вам прогуляться по этой горе, вместо того, чтобы пытаться просверлить ее или залезть на нее, то есть реализовать простую строку в строковый конвертер.
Приветствия и hth.,
Ответ 6
Вы можете использовать библиотеку boost:: locale:
http://www.boost.org/doc/libs/1_49_0/libs/locale/doc/html/charset_handling.html
Код будет выглядеть так:
#include <boost/locale.hpp>
std::string utf8_string = to_utf<char>(latin1_string,"Latin1");