Re: Как правильно сделать поддержку юникода в программе
Hello!
> ICU — это стрельба по воробьям межконтинентальной баллистической ракетой.
> Библиотека, первоначально написанная для Java и потом портированная для C++
> и C. Большинство функций вряд ли понадобятся (некоторые довольно
> экзотические, как например запись чисел словами на разных языках).
Не знал таких подробностей. Немного поковыряв, удалось ICU скомпилить с эскулайт под линукс и
виндоус, теперь в рассылке эскулайт периодически подсказываю, как это делается, а сам мечтаю
избавиться от такого балласта. Эскулайтом я постепенно в своих проектах постгрес заменяю, нужные
расширения написал (не много и нужно, в сущности - работа с ip-адресами, md5 суммы для текстовой
строки, для строки таблицы и целой таблицы, сжатие/распаковка данных, генерация uuid и т.п.), пора
бы и "отбросить хвост" в виде libicu. Кстати, разработчик ГИС-модуля к sqlite использует iconv для
перекодирования. А вот полнотекстовый поиск работает с юникодом через ICU.
> Что имеется ввиду под поддержкой уникода? Обычно требуется только:
> 1) Унифицированное представление текста на разных языках. Обычно UCS2, UCS4
> или UTF-8. Иногда используют wchar_t и/или мультибайтовые строки.
Попробую конкретизировать. Итак, юникод - UTF-8. Хотелось бы еще UTF16, хотя я ни разу его не
использовал и не видел, чтобы кто-то использовал. Но движок sqlite имеет нативную поддержку UTF16,
может пригодиться.
Требуется ввод/вывод - смотрел примеры перекодирования через iconv, вроде устраивает.
Далее, нужно сравнение символов, сортировка строк, смена регистра.
Вот что требуется от функций смены регистра:
** upper('ABC') -> 'abc'
** lower('abc') -> 'ABC'
** lower('I', 'en_us') -> 'i'
** lower('I', 'tr_tr') -> 'ı' (small dotless i)
Сравнение с шаблоном, как я понимаю, через вышеперечисленное пишется, но хотелось бы пример, чтобы
грамотно реализовать функции LIKE и REGEXP - они и так медленные, писать надо аккуратно.
> 2) Ввод/вывод в разных кодировках. Достаточно iconv или recode. Тикль и
> питон тащат свои таблицы перекодировки. Львиную долю тут занимают всякие
> китайские и японские кодировки, если очень жмёт, то можно сэкономить.
На этом экономить точно не стоит, поскольку в стране восходящего солнца вменяемых разработчиков
хватает и с ними можно будет и в апстрим протащить, т.к. они тоже знакомы с проблемой кодировок не
по наслышке .
> 3) Определение класса символа (буква, цифра, пробел и т. п.),
> преобразование регистра. Для wchar_t есть стандартные локалезависимые
> функции в C99. Для уникода можно взять нетяжёлую libunicode.
Наверное, мне это и надо, если с этими функциями можно выполнить преобразования вида
lower('I', 'en_us') -> 'i'
> 4) Чисто уникодные функции. Комбинированные символы, названия каждого
> символа и т. п. Тут уже нужна специальная библиотека. И немаленькая.
Названия символов в движке СУБД знать не требуется. А что такое "комбинированные символы"?
P.S. Есть кроссплатформенный способ реализации - забиндить нужные функции из тикля (питона, etc.).
Но, во-первых, для сравнения символов такой метод получается медленнее раза в 2 - 4, чем через
libicu. Во-вторых, иногда нужно вызвать sqlite просто из консоли и хотелось бы иметь встроенные
функции.
Best regards, Alexey.
Reply to: