Подтвердить что ты не робот

Преобразование строк ISO-8859-1 в UTF-8 в C/С++

Вы считаете, что это будет легко доступно, но мне сложно найти простую библиотечную функцию, которая преобразует строку C или С++ из ISO-8859-1 в UTF-8. Я читаю данные, которые находятся в 8-битной кодировке ISO-8859-1, но нужно преобразовать ее в строку UTF-8 для использования в базе данных SQLite и, в конечном итоге, в приложении для Android.

Я нашел один коммерческий продукт, но в настоящее время он выходит за рамки моего бюджета.

4b9b3361

Ответ 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.,