Боюсь, я не могу помочь с Суонком или 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]+
вместо этого не имеет значения, то же самое с японцами.
Но посмотрите, эта ссылка на регулярное выражение : \p{L}
соответствует любому символу Unicode в категории Letter, так что на самом деле это работает для норвежского
(re-seq #"\p{L}+" "prøve")
=> ("prøve")
, а также для японского языка (по крайней мере, я так полагаю, я не могу прочитать его, но, кажется, это происходит):
(re-seq #"\p{L}+" "日本語 の 文章 に は スペース が 必要 ない って、 本当?")
=> ("日本語" "の" "文章" "に" "は" "スペース" "が" "必要" "ない" "って" "本当")
Есть много другихтакие опции, как сопоставление при комбинировании диакритических знаков и еще много чего, можно найти в справочнике.
Редактировать: Подробнее о Unicode в 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, поэтому многим нелатинским сценариям нужны два символа для представления одного символа.
При работе с нелатинским Unicode часто лучше использовать code points
, а не символы.Кодовая точка - это один символ / символ Unicode, представленный как int.Классы String и Character имеют методы для преобразования между символами Java и кодовыми точками Unicode.
Я выкладываю это здесь, поскольку иногда мне это нужно, но недостаточно часто, чтобы на самом деле запомнить детали от одного раза к другому.Что-то вроде записки для моего будущего себя, и это может быть полезно для других, начинающих с международных языков и кодировок.