Как я использую unicode символы (UTF-8) в регулярных выражениях Clojure?

Это - двойной вопрос для Вас удивительно добрые Сложенные Водосливные Мастера там.

  1. Как я устанавливаю emacs/slime/swank, чтобы использовать UTF-8 при разговоре с Clojure или использовать UTF-8 в командной строке REPL? В данный момент я не могу отправить неримские символы для чванений-clojure, и использование командной строки, REPL искажает вещи.

  2. Действительно легко сделать регулярные выражения на латинском тексте:

    (re-seq # "[\w] +" "Это действительно верно, что японским предложениям не нужны пробелы?")

Но что, если у меня был некоторый японец? Я думал, что это будет работать, но я не могу протестировать его:

(re-seq #"[(?u)\w]+" "日本語 の 文章 に は スペース が 必要 ない って、 本当?")

Становится более трудным, если мы должны использовать словарь, чтобы найти разрывы слова или найти katakana-единственное слово сами:

(re-seq #"[アイウエオ-ン]" "日本語の文章にはスペースが必要ないって、本当?")

Спасибо!

12
задан ivar 23 June 2010 в 11:48
поделиться

4 ответа

Боюсь, не могу помочь с 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.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 - спецификация шаблонов regexp, включая блоки и категории Unicode.

Символы/строки Java имеют внутренний код UTF-16. Тип char (и его обертка Character) имеет 16 бит, что недостаточно для представления всего Юникода, поэтому многим нелатинским сценариям требуется два символа для представления одного символа.

При работе с нелатинским Юникодом часто лучше использовать кодовые точки, а не символы. Кодовая точка - это один символ/символ Юникода, представленный как int. Классы String и Character имеют методы для преобразования между символами Java и кодовыми точками Unicode.

  • unicode.org - стандарт Юникода и кодовые карты.

Я помещаю это здесь, поскольку мне иногда нужны эти вещи, но не настолько часто, чтобы помнить детали от одного раза к другому. Это своего рода заметка для моего будущего "я", и это может быть полезно другим людям, начинающим изучать международные языки и кодировки.

15
ответ дан 2 December 2019 в 05:14
поделиться

Для катаканы, Википедия показывает вам упорядочение Unicode. Так что если бы вы хотели использовать класс символов regex, который ловит все катаканы, я полагаю, вы могли бы сделать что-то вроде этого:

user> (re-seq #"[\u30a0-\u30ff]+" "日本語の文章にはスペースが必要ないって、本当?")
("スペース")

Хирагана, чего бы это ни стоило:

user> (re-seq #"[\u3040-\u309f]+" "日本語の文章にはスペースが必要ないって、本当?")
("の" "には" "が" "ないって")

Я был бы весьма удивлен, если бы какой-нибудь regex мог обнаружить разрывы японских слов.

3
ответ дан 2 December 2019 в 05:14
поделиться

для международных символов вам необходимо использовать классы символов Java, что-то вроде [\ p {javaLowerCase} \ p {javaUpperCase}] + для соответствия любому символу слова ... \ w используется для ASCII - см. Java.util.Regex документация

2
ответ дан 2 December 2019 в 05:14
поделиться

Я отвечу здесь на пол-вопроса:

Как мне настроить emacs / slime / swank для использования UTF-8 при разговоре с Clojure или использовать UTF-8 в команде- строка REPL?

Более интерактивный способ:

  1. M-x customize-group
  2. "slime-lisp"
  3. Найдите параметр для системы кодирования слизи и выберите utf-8-unix. Сохраните это, чтобы Emacs забрал его в следующем сеансе.

Или поместите это в свой .emacs:

(custom-set-variables '(slime-net-coding-system (quote utf-8-unix)))

Это то, что интерактивное меню будет делать в любом случае.

Работает на Emacs 23 и работает на моей машине

8
ответ дан 2 December 2019 в 05:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: