Шрифт:
Если вы не пользуетесь монолитной формой, то в некоторых случаях метод может сработать, поскольку латинские буквы отделены от диакритических знаков. Но в общем случае работать не будет — в частности, для турецкого, немецкого, голландского и любого другого языка с нестандартными правилами преобразования регистра.
Возможно, вы думаете, что неакцентированные символы в некотором смысле эквивалентны своим акцентированным вариантам. Это почти всегда не так. Здесь мы имеем дело с разными символами. Убедимся в этом на примере метода
Но для составных (не монолитных) символов верно прямо противоположное. В этом случае латинская буква распознается.
Метод
Существует вспомогательный метод
В библиотеке
Можно побайтно просматривать строку, как обычно, с помощью итератора
Если вы запутались, не переживайте. Все мы через это проходили. Я попытался свести все вышесказанное в таблицу 4.1.
Таблица 4.1. Составные и монолитные формы
| Монолитная форма "'e" | ||||
|---|---|---|---|---|
| Название символа | Глиф | Кодовая позиция | Байты UTF-8 | Примечания |
| Строчная латинская e с акутом | 'e | U+00E9 | 0xC3 0хА9 | Один символ, одна кодовая позиция, один байт |
| Составная форма "'e" | ||||
| Название символа | Глиф | Кодовая позиция | Байты UTF-8 | Примечания |
| Строчная латинская е | е | U+0065 | 0x65 | Один символ, две кодовых позиции (два «программистских символа»), три байта UTF-8 |
| Модифицирующий акут | U+0301 | 0xCC 0x81 |
Что еще надо учитывать при работе с интернациональными строками? Квадратные скобки по-прежнему относятся к байтам, а не к символам. Но при желании это можно изменить. Ниже приведена одна из возможных реализаций (не особенно эффективная, зато понятная):
Конечно, здесь не реализована значительная часть функциональности настоящего метода
У метода
Вот несколько более полезный пример, в котором все кодовые позиции в строке, отличные от ASCII (то есть начиная с U+0080), преобразуются к виду U+XXXX, который мы обсуждали выше: