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

Re: Возможна ли поддержка тиклем юникода?



Alexey Pechnikov wrote:

> Hello!
> 
>> Удаление акцента, как и преобразование регистра, и т.п. производится над
>> строкой символов уникода. А UTF-8 — всего лишь представление этой строки
>> в виде последовательности байт.
> 
> Извиняюсь за некорректное использование терминов, сейчас вроде понятнее
> становится, попробую переформулировать вопрос.
> 
> Если входные данные в представлении UTF-8, логично использовать функции 
> именно для этого представления. Но почему-то функции вижу только для
> UTF-16 (библиотека ubaccent) и UTF32 (система). Зачем этот зоопарк и как с
> ним жить?

Если нужна посимвольная обработка, определение типа (буква, знак препинания
и т.п.), преобразование (регистра, убирание акцента,…), то удобнее работать
с представлением, в котором размер каждого символа одинаков. Иначе всё
равно каждый символ пришлось бы преобразовывать при извлечении из строки.
Да и индексация, замена возможны.

Но для этого совершенно не подходят старые функции работы со строками,
программу нужно писать по-другому.

Если же достаточно ввода/вывода, запросить у пользователя имя, вывести его
же, или сохранить в файле, чтобы вывести после, то удобнее использовать
UTF-8. При этом не нужно переписывать полностью старые программы,
большинству вообще не нужна переделка. Большинство функций для работы с
8-битовыми строками будут с таким же успехом работать и с UTF-8 (а вот
UTF-16 и UTF-32 не подойдут), по крайней мере в старой области значений.

Поэтому UTF-8 используют как стандартное внешнее представление (чтобы с
данными работали другие программы) и как внутреннее, если не нужна сложная
работа со строками, учитывающая уникодность.

> Про UTF-16BE я уже понял, но вот буква Ё пропадает. А если через iconv
> передавать, все ок.

А откуда ты берёшь Ё в UTF-16BE? Ты уверен, что это именно Ё? Подозреваю,
что ты ошибся с преобразованием. Ни "Ё", ни L"Ё" не даст тебе Ё в UTF-16BE
на большинстве систем (к которым ты имеешь доступ).

> А какая-то библиотека лучше этой есть в системе?

Я не знаю.

> Можно на примере пояснить? Есть две строки utf8 в формате multibyte
> string, как я понимаю. Пока что я вижу только вариант с преобразованием
> этих строк в wide-character strings с помощью mbstowcs() и далее
> сравнением функцией wcsncasecmp/wcsncmp.

Да.

> Как сделать "в один ход" 
> сравнение multibyte строк (символов)? В примерах, что я видел,
> разработчики таскают с собой таблицы для сравнения юникодных символов,
> зато могут работать с многобайтовыми строками, не занимаясь бесконечными
> преобразованиями.

Чтобы посимвольно сравнивать многобайтовые строки, необходимо посимвольно
извлекать из них символы для сравнения (с/без учётом акцентов, регистров и
т.п.). Т.е. декодировать последовательно каждую из строк. Для каждого
сравнения. Все строки.

Но если нам не нужен алфавитный порядок, если нужно просто упорядочить
строки (для деревьев, для бинарного поиска), то можем просто использовать
strcmp для многобайтовых строк в UTF-8. UTF-8 имеет такое свойство, что
результат этого сравнения будет совпадать с результатом посимвольного
сравнения кодов уникодных символов.



Reply to: