2010-06-23 2 views
12

Это двойной вопрос для вас, удивительно добрый Stacked Overflow Wizards.Как использовать символы Unicode (UTF-8) в регулярных выражениях Clojure?

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

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

    (? Ре-сл # «[\ ш] +» «Это действительно так, что японские предложения не нужны пробелы»)

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

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

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

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

Спасибо!

ответ

15

Не могу помочь с шиком или 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 

Параметр \ ш скачет расширенные символы. Использование [(?u)\w]+ вместо этого не имеет значения, то же самое с японцами.

Но видеть this regex reference: \p{L} соответствует любому символу Unicode в категории Letter, так что на самом деле работает на норвежском

(re-seq #"\p{L}+" "prøve") 
=> ("prøve") 

, а также для японского языка (по крайней мере, я полагаю, это так, я не могу читать его, но его кажется, на стадионах):

(re-seq #"\p{L}+" "日本語 の 文章 に は スペース が 必要 ない って、 本当?") 
=> ("日本語" "の" "文章" "に" "は" "スペース" "が" "必要" "ない" "って" "本当") 

Есть много других вариантов, как соответствие на комбинировании диакритические знаки и этажерку, проверьте ссылку.

Edit: Больше на 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 часто лучше использовать символы code points, а не символы. Кодовая точка - это один символ/символ Юникода, представленный как int. Классы String и Character имеют методы преобразования символов Java и кодов Unicode.

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

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

+2

Nice! Да, переключатель \ p {L} был именно тем, что я хотел, и я действительно немного удивлен, что он работал на японском языке. Спасибо за ссылку. – ivar

2

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

3

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

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

хирагана, для чего это стоит:

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

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

+0

Спасибо за помощь, г-н Корейка, читающая японский язык.^_^Согласовано, регулярное выражение, которое могло бы обнаружить разрывы японского слова, было бы абсолютно невероятным. – ivar

8

Ответит половину вопрос здесь:

Как настроить Emacs/слизь/Суонк использовать UTF-8 при разговоре с Clojure, или использовать UTF-8 в командной строке REPL?

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

  1. M-х подгоняет-группа
  2. "шламовых сюсюкать"
  3. Найти вариант для системы тина кодирования и выберите UTF-8-UNIX. Сохраните это, и Emacs подберет его на следующей сессии.

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

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

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

Работы по Emacs 23 и works on my machine

0

Приставка ваше регулярное выражение с (?U) как так: (re-matches #"(?U)\w+" "ñé2_hi") => "ñé2_hi".

Это устанавливает флаг UNICODE_CHARACTER_CLASS в true, чтобы типичные классы символов выполняли то, что вы хотите, с Unicode без ASCII.

См. Дополнительную информацию: http://docs.oracle.com/javase/8/docs/api/java/util/regex/Pattern.html#UNICODE_CHARACTER_CLASS

Смежные вопросы