Это - двойной вопрос для Вас удивительно добрые Сложенные Водосливные Мастера там.
Как я устанавливаю emacs/slime/swank, чтобы использовать UTF-8 при разговоре с Clojure или использовать UTF-8 в командной строке REPL? В данный момент я не могу отправить неримские символы для чванений-clojure, и использование командной строки, REPL искажает вещи.
Действительно легко сделать регулярные выражения на латинском тексте:
(re-seq # "[\w] +" "Это действительно верно, что японским предложениям не нужны пробелы?")
Но что, если у меня был некоторый японец? Я думал, что это будет работать, но я не могу протестировать его:
(re-seq #"[(?u)\w]+" "日本語 の 文章 に は スペース が 必要 ない って、 本当?")
Становится более трудным, если мы должны использовать словарь, чтобы найти разрывы слова или найти katakana-единственное слово сами:
(re-seq #"[アイウエオ-ン]" "日本語の文章にはスペースが必要ないって、本当?")
Спасибо!
Боюсь, не могу помочь с swank или 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}+" "日本語 の 文章 に は スペース が 必要 ない って、 本当?")
=> ("日本語" "の" "文章" "に" "は" "スペース" "が" "必要" "ない" "って" "本当")
Есть много других вариантов, например, совпадение по сочетанию диакритических знаков и тому подобное, посмотрите ссылку.
Edit: More on Unicode in Java
Краткая ссылка на другие моменты, представляющие потенциальный интерес при работе с Unicode.
К счастью, Java обычно очень хорошо справляется с чтением и записью текста в правильных кодировках для данного места и платформы, но иногда вам нужно переопределить это.
Это все Java, у большинства этих вещей нет обертки Clojure (по крайней мере, пока).
Символы/строки Java имеют внутренний код UTF-16. Тип char
(и его обертка Character) имеет 16 бит, что недостаточно для представления всего Юникода, поэтому многим нелатинским сценариям требуется два символа для представления одного символа.
При работе с нелатинским Юникодом часто лучше использовать кодовые точки
, а не символы. Кодовая точка - это один символ/символ Юникода, представленный как int. Классы String и Character имеют методы для преобразования между символами Java и кодовыми точками Unicode.
Я помещаю это здесь, поскольку мне иногда нужны эти вещи, но не настолько часто, чтобы помнить детали от одного раза к другому. Это своего рода заметка для моего будущего "я", и это может быть полезно другим людям, начинающим изучать международные языки и кодировки.
Для катаканы, Википедия показывает вам упорядочение Unicode. Так что если бы вы хотели использовать класс символов regex, который ловит все катаканы, я полагаю, вы могли бы сделать что-то вроде этого:
user> (re-seq #"[\u30a0-\u30ff]+" "日本語の文章にはスペースが必要ないって、本当?")
("スペース")
Хирагана, чего бы это ни стоило:
user> (re-seq #"[\u3040-\u309f]+" "日本語の文章にはスペースが必要ないって、本当?")
("の" "には" "が" "ないって")
Я был бы весьма удивлен, если бы какой-нибудь regex мог обнаружить разрывы японских слов.
для международных символов вам необходимо использовать классы символов Java, что-то вроде [\ p {javaLowerCase} \ p {javaUpperCase}] + для соответствия любому символу слова ... \ w используется для ASCII - см. Java.util.Regex документация
Я отвечу здесь на пол-вопроса:
Как мне настроить emacs / slime / swank для использования UTF-8 при разговоре с Clojure или использовать UTF-8 в команде- строка REPL?
Более интерактивный способ:
Или поместите это в свой .emacs:
(custom-set-variables '(slime-net-coding-system (quote utf-8-unix)))
Это то, что интерактивное меню будет делать в любом случае.
Работает на Emacs 23 и работает на моей машине