Ответ 1
Не могу помочь с шиком или Emacs, боюсь. Я использую Enclojure на NetBeans, и он хорошо работает там.
При совпадении: как сказал Алекс, \w
не работает для неанглийских символов, даже расширенные латинские кодировки для Западной Европы:
(re-seq #"\w+" "prøve") =>("pr" "ve") ; Norwegian
(re-seq #"\w+" "mañana") => ("ma" "ana") ; Spanish
(re-seq #"\w+" "große") => ("gro" "e") ; German
(re-seq #"\w+" "plaît") => ("pla" "t") ; French
\ w пропускает расширенные символы. Использование [(?u)\w]+
вместо этого не имеет значения, то же самое с японским.
Но см. эта ссылка для regex: \p{L}
соответствует любому символу Юникода в категории Letter, поэтому он действительно работает для норвежского
(re-seq #"\p{L}+" "prøve")
=> ("prøve")
а также для японцев (по крайней мере, я полагаю, что я не могу его прочитать, но, похоже, это в шаге):
(re-seq #"\p{L}+" "日本語 の 文章 に は スペース が 必要 ない って、 本当?")
=> ("日本語" "の" "文章" "に" "は" "スペース" "が" "必要" "ない" "って" "本当")
Есть много других опций, таких как совпадение при объединении диакритических знаков и еще чего-то, проверьте ссылку.
Изменить: больше в Юникоде в Java
Краткая ссылка на другие точки, представляющие потенциальный интерес при работе с Unicode.
К счастью, Java, как правило, очень хорошо читает и пишет текст в правильных кодировках для местоположения и платформы, но иногда вам нужно переопределить его.
Это все Java, большинство из этого материала не имеет обертки Clojure (по крайней мере, пока).
- java.nio.charset.Charset - представляет собой кодировку, такую как US-ASCII, ISO-8859-1, UTF-8
- java.io.InputStreamReader - позволяет указать кодировку для перевода из байтов в строки при чтении. Существует соответствующий OutputStreamWriter.
- java.lang.String - позволяет указать кодировку при создании строки из массива байтов.
- java.lang.Character - имеет методы для получения категории символов Unicode и преобразования между символами Java и кодами Unicode.
- java.util.regex.Pattern - спецификация шаблонов регулярных выражений, включая блоки и категории Unicode.
Символы/строки Java являются внутренними UTF-16. Тип char
(и его символ-оболочка) составляет 16 бит, что недостаточно для представления всего Юникода, поэтому для многих нелатинских скриптов требуется два символа для обозначения одного символа.
При работе с нелатинским Unicode часто лучше использовать code points
, а не символы. Кодовая точка - это один символ/символ Юникода, представленный как int. Классы String и Character имеют методы преобразования символов Java и кодов Unicode.
- unicode.org - стандартные и кодовые диаграммы Unicode.
Я помещаю это здесь, так как мне иногда нужно это, но не часто достаточно, чтобы фактически запомнить детали из одного раза в другое. Образец примечания к моему будущему "я", и это может быть полезно для других, начинающих работу с международными языками и кодировками.