[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

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: