Привет, коллеги. Сразу предупреждаю, что всё ниже очень интересно, но на практике нужно редко. Разве что вам надо работать с текстом на странном языке или отлаживать софт, который много работает с юникодом.
Юникодных кодировок известно несколько, но имеет смысл сосредоточиться на UTF8. Ее достоинство в том, что она совместима с семибитной ASCII (грубо говоря, латиницей). Дело в том, что символы кодируются в UTF8 разным числом байт, от одного до четырех, и однобайтовые накрывают ASCII. Проще говоря, текст на английском одинаково выглядит и в UTF8 и, в latin1.
Надо понимать, что в Юникоде очень много символов, и многие похожи. Так, ß≠β (слева немецкая эсцет, справа греческая бета), а символы AΑА𝖠A𝙰 все разные. Эти черточки тоже все разные: ‐ — – ― -.
Еще одна проблема — это модификаторы: символы, которые сами не отображаются, но меняют вид базового символа.
Например, õ — это два символа: o (код 0x6f) и модификатор "тильда" (код 0x303). Модификаторов может быть больше одного, а иногда и больше двух.
Ситуацию усугубляют два фактора. Во-первых, если модификаторов больше одного, то их порядок может быть важен, а может и не быть. Например, этот символ может быть собран с разным порядком седили и циркумфлекса, и выглядит это (почти) одинаково: Û̧ и Û̧. Почти потому, что зависит от шрифта. В Виме одинаково, а в Дзене вот тут у меня — не совсем. А вот тут порядок циркумфлекса и грависа важен: Û̀ и Ù̂. Примеры, конечно, надуманные.
Во-вторых, некоторые символы идут "в сборе", например наши ё и й или итальянская (не только итальянская, конечно) è (код 0xe8). А можно их сделать и модификатором: например, вот й в два символа.
Команды, которые ищут букву (f, F, t, T) найдут букву и с модификатором. Так, fи найдет й и и̃ , но не найдет й. А fй найдет именно ту й, которую вы указали: цельную (код 0x0439) или сборную.
А если вы хотите искать именно модифицированную букву, то вы должны вводить ее как один символ, привязкой, например. Потому что команда ждет одного символа. Как и r.
А вот поиск — не найдет комбинированные символы, если в шаблоне простые. Тут надо применять тонкие средства. Так, символ \Z предписывает игнорировать модификаторы. Это важно для иврита и арабского с огласовками, но может быть полезно и для языков с диакритикой. А класс [[=e=]] совпадает с базовой е, независимо от диакритики. Вместо e может быть, конечно, и любая другая буква.
Еще есть ключ \%C, который ставится после символа и означает "игнорировать модификаторы". Пример из Справки: шаблон /a не совпадет в слове càt, а /a\%C совпадет, потому что à здесь сборная, с модификатором. Однако он не совпадет с cát, потому что это цельный символ 0xe1.
Порядок модификаторов при поиске роли не играет, причем в тексте их может быть больше, чем в шаблоне, и совпадение будет. Так /Am найдет как Amn, так и Anm, если А базовый символ, а n и m — модификаторы.
Если шаблон начинается с модификатора или модификатор стоит после чего-то, что не имеет модификаторов, то ищется сам модификатор: иными словами, все символы с ним. Например, все символы с тильдой. Но опять же, цельные символы при этом не поймаются. Ну что поделать, ё это не "е с умлаутом", а просто CYRILLIC LETTER YO.
Поиска по блокам и алфавитам Юникода в Виме пока нет. То есть, вы не сможете отловить в тексте символы японской хираганы, не перечислив их все в квадратных скобках. Ну, или я не знаю способа. Русский ловим так: [а-яё]. Не забываем, что ё идет не по алфавиту.
Число допустимых в Вим модификаторов указывает опция maxcombine, по умолчанию 2. В иврите, если использовать огласовки, может понадобиться до четырех.
А если выставлен флаг delcombine, то x удаляет не весь сборный символ, а модификаторы по одному, символ будет удален последним. Аналогично, начиная с седьмой версии, dw удаляет последний модификатор первого символа в слове. Клавиши DEL и BS тоже удаляют сначала модификаторы, "раздевая" символ.
Полезно уметь определять, что за символ(ы) перед вами. Вам помогут команды ga (показывает коды символов, в том числе и модификаторов) и g8 (показывает байты, составляющие символ, включая и модификаторы). Так, ga на сборной "и краткой" выше выводит вот что:
<и> 1080, Hex 0438, Octal 2070 < ̆> 774, Hex 0306, Octal 1406
а на обычной й:
<й> 1081, Hex 0439, Octal 2071
Тогда как g8 выводит, соответственно, "d0 b8 + cc 86" и "d0 b9".
Есть команда 8g8, которая ищет некорректную для UTF8 последовательность байт под курсором или далее по строке. Работает, если файловая кодировка 8-битная (не юникод).
Как будет сортироваться юникодный винегрет? Видимо, по кодам. Не по алфавиту! Я уже говорил, что ё идет после я, причем не сразу: между ними есть ещё ѐ, и я даже не знаю, что это за буква, какого алфавита. Видимо, кириллица, потому что у è другой код. Цельные буквы с акцентами идут после латиницы. В некоторых языках они и идут после, в иных нет. Способа сортировать по алфавиту в Виме я не знаю. Узнаю если, то сообщу.
Удачи, коллеги!
Каналы, которые все рекомендую
Хорошие научно-популярные каналы отдельным списком