-Рубрики

 -Поиск по дневнику

Поиск сообщений в whitewin

 -Подписка по e-mail

 

 -Статистика

Статистика LiveInternet.ru: показано количество хитов и посетителей
Создан: 25.03.2009
Записей:
Комментариев:
Написано: 50


Переносимый способ обработки UTF-8 строк в C++

Четверг, 28 Января 2010 г. 22:08 + в цитатник
  Текущий стандарт С++ (C++98 и C++03) не поддерживает Unicode, поэтому при обработки текста в кодировке UTF-8 возникает множество проблем. UTF-8 текст можно хранить в объекте std::string или массиве символов char*, но в этом случае стандартные средств определения количество символов в строке или перемещения итератора (указателя) на следующий или предыдущий символ в строке будут работать не корректно. Решить некоторых проблемы обработки UTF-8 строк можно, воспользовавшись «header-only» библиотекой UTF8-CPP. UTF8-CPP состоит из шаблонов функций с проверкой правильности обрабатываемых данных (эти шаблоны функции определены в пространстве имён utf8) и более быстрых, но небезопасных шаблонов функций, без проверки (определены в пространстве имён utf8::unchecked). Функции с проверкой, в случае обнаружения неправильных данных, генерируют соответственные исключения. Все исключения библиотеки являются производными от std::exception.
  Список функций из пространства имён utf8:

Функция

Описание

utf8::append

Кодирует 32 битовое представление кодовой точки (code point) в UTF-8 последовательность октетов и добавляет эту последовательность к UTF-8 строке.

utf8::next

В качестве параметра получает ссылку на итератор начала UTF-8 последовательности, возвращает 32-х битовое представление кодовой точки и перемещает итератор на начало следующей UTF-8 последовательности.

utf8::peek_next

Аналогично utf8::next, но не изменяет позицию итератора.

utf8::prior

В качестве параметра получает итератор на любой октет в UTF-8 последовательности, перемещает итератор на начало предыдущий UTF-8 последовательности, возвращает 32-х битовое представление кодовой точки. Эту функцию можно применять для нахождения начала UTF-8 последовательности, имея случайную позицию в строке.

utf8::advance

Перемещает итератор на указанное количество кодовых точек. Перемещение допустимо только в сторону увеличения итератора.

utf8::distance

Возвращает количество кодовых точек между двумя итераторами.

utf8::utf16to8

Перекодирует строку из UTF-16 в UTF-8

utf8::utf8to16

Перекодирует строку из UTF-8 в UTF-16

utf8::utf32to8

Перекодирует строку из UTF-32 в UTF-8

utf8::utf8to32

Перекодирует строку из UTF-8 в UTF-32

utf8::find_invalid

Возвращает итератор на первую найденную, неправильную, последовательность в UTF-8 строке.

utf8::is_valid

Определяет, является ли указанная последовательность октетов правильной UTF-8 строкой. Вызов функции аналогичен коду find_invalid(start, end) == end.

utf8::replace_invalid

Заменяет указным значением, в UTF-8 строке, все неправильные последовательности.

utf8::is_bom

Определяет, является ли указанная последовательность октетов маркером порядка байтов (BOM).


  Пример использования библиотеки (не переносим из-за вывода на экран;), исходный текст в UTF-8, системная локаль ru_UA.UTF-8):

#include <iostream> #include <string> #include <string.h> #include "utf8.h" // подключаем библиотеку using namespace std; template<typename in_iterator> void print_symbols(in_iterator begin, in_iterator end) { const size_t sizeSimbol = 5; char Symbol[sizeSimbol] = {0, 0, 0, 0, 0}; uint32_t cp; while (begin < end) { memset(Symbol, 0, sizeSimbol); cp = utf8::next(begin, end); utf8::append(cp, Symbol); cout << "[" << Symbol << "]"; } cout << endl; } int main(int ac, char* av[]) { const char *str_char = "Привет Мир!!!!"; string str_std = str_char; cout << "Длинна str_char в байтах:" << strlen(str_char); cout << " Символов в str_char:"; cout << utf8::distance(str_char, str_char+strlen(str_char)); cout << endl; cout << "Длинна str_std в байтах:" << str_std.length(); cout << " Символов в str_std:"; cout << utf8::distance(str_std.begin(), str_std.end()); cout << endl; print_symbols(str_std.begin(), str_std.end()); print_symbols(str_char, str_char + strlen(str_char)); return 0; }

  Результат работы программы:
Длинна str_char в байтах:23 Символов в str_char:14
Длинна str_std в байтах:23 Символов в str_std:14
[П][р][и][в][е][т][ ][М][и][р][!][!][!][!]
[П][р][и][в][е][т][ ][М][и][р][!][!][!][!]

Ссылки:
UTF8-CPP: UTF-8 with C++ in a Portable Way
Скачать библиотеку
Термины Юникод
Метки:  
Понравилось: 25 пользователям

Wolverrum   обратиться по имени Re: Текущий стандарт С++ (C++98 и C++03) не поддерживает Unicode Суббота, 30 Января 2010 г. 02:10 (ссылка)
Просто замечательно.

PS Вчера переводил акробатный плагин ansi->unicode. Ощущения в заднице незабываемые :)
Ответить С цитатой В цитатник
 

Добавить комментарий:
Текст комментария: смайлики

Проверка орфографии: (найти ошибки)

Прикрепить картинку:

 Переводить URL в ссылку
 Подписаться на комментарии
 Подписать картинку