Jak używać znaków unicode (UTF-8) w wyrażeniach regularnych Clojure?

To jest podwójne pytanie dla Ciebie zadziwiająco miłych czarodziejów przepełnienia tam.

  1. Jak ustawić emacs/slime / swank, aby używał UTF-8 podczas rozmowy z Clojure, lub użyć UTF-8 W REPL wiersza poleceń? W tej chwili nie mogę wysłać żadnych Nie-rzymskich znaków do swank-clojure, a za pomocą wiersza poleceń REPL garb rzeczy.

  2. Bardzo łatwo jest wykonywać wyrażenia regularne w tekście łacińskim:

    (re-seq # "[\w]+ "" to prawda, że Japońskie zdania nie potrzebujesz spacji?")

Ale co, gdybym miał trochę japońskiego? Myślałem, że to zadziała, ale nie mogę tego przetestować: {]}
(re-seq #"[(?u)\w]+" "日本語 の 文章 に は スペース が 必要 ない って、 本当?")
[[2]}jest trudniej, jeśli musimy użyć słownika, aby znaleźć przerwy w słowie lub znaleźć słowo tylko katakana:
(re-seq #"[アイウエオ-ン]" "日本語の文章にはスペースが必要ないって、本当?")
Dzięki!
Author: ivar, 2010-06-23

5 answers

Obawiam się, że nie mogę pomóc swank ' owi ani Emacsowi. Używam Enclojure na NetBeans i działa tam dobrze.

Na dopasowanie: jak powiedział Alex, \w nie działa dla znaków nie-angielskich, nawet rozszerzonych znaków łacińskich dla Europy Zachodniej:

(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 pomija rozszerzone znaki. Użycie [(?u)\w]+ zamiast tego nie robi różnicy, tak samo z Japończykami.

Ale patrz to odniesienie regex: \p{L} pasuje do dowolnego znaku Unicode w kategorii Letter, więc faktycznie działa dla norweskiego

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

Jak i dla Japończyków (przynajmniej tak mi się wydaje, nie mogę tego odczytać, ale wydaje się, że jest na boisku):

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

Istnieje wiele innych opcji, takich jak dopasowanie do łączenia znaków diakrytycznych i tak dalej, sprawdź odniesienie.

Edit: więcej o Unicode w Javie

Szybkie odniesienie do innych potencjalnych punktów zainteresowania podczas pracy z Unicode.

Na szczęście, Java generalnie bardzo dobrze radzi sobie z czytaniem i pisaniem tekst w odpowiednim kodowaniu dla lokalizacji i platformy, ale czasami trzeba go zastąpić.

To wszystko Java, większość z tych rzeczy nie ma wrappera Clojure(przynajmniej jeszcze nie).

  • java.nio.charset.Charset - reprezentuje zestaw znaków jak US-ASCII, ISO-8859 - 1, UTF-8
  • java. io . InputStreamReader - pozwala określić zestaw znaków do przetłumaczenia z bajtów na ciągi znaków podczas czytania. Istnieje odpowiedni OutputStreamWriter.
  • java.lang.String - pozwala określić zestaw znaków podczas tworzenia łańcucha z tablicy bajtów.
  • java.lang.Character - posiada metody uzyskiwania kategorii Unicode znaku i konwersji pomiędzy znakami Java i punktami kodu Unicode.
  • java.util.regex.Pattern - Specyfikacja wzorców regexp, w tym bloków i kategorii Unicode.

Znaki/łańcuchy Javy są wewnętrznie UTF-16. Na char typ (i Jego znak wrapper) to 16 bitów, co nie wystarczy, aby reprezentować cały Unicode, więc wiele skryptów nie-łacińskich potrzebuje dwóch znaków, aby reprezentować jeden symbol.

W przypadku nie-łacińskiego Unicode często lepiej używać code points zamiast znaków. Punkt kodowy to jeden znak/symbol Unicode reprezentowany jako int. Klasy String i Character posiadają metody konwersji pomiędzy znakami Java i punktami kodu Unicode.

Umieszczam to tutaj, ponieważ czasami potrzebuję tych rzeczy, ale nie na tyle często, aby pamiętać szczegóły od jednego do drugiego. Coś w rodzaju notki dla mojego przyszłego ja, i może być przydatna dla innych, zaczynając od języków międzynarodowych i kodowania, jak również.

 15
Author: j-g-faustus,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-06-25 04:19:32

Odpowiem tu na pół pytania:

Jak ustawić Emacs/slime / swank, aby używał UTF-8 podczas rozmowy z Clojure, lub użyć UTF-8 W REPL wiersza poleceń?

Bardziej interaktywny sposób:

  1. m-x customize-group
  2. "slime-lisp"
  3. znajdź opcję Slime coding system i wybierz utf-8-unix. Zapisz to, aby Emacs podniósł go w następnej sesji.

Albo umieść to w swoim .emacs:

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

To co i tak zrobi interaktywne menu.

Działa na Emacsie 23 i Działa na mojej maszynie

 8
Author: Leonel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-07-23 12:33:05

Dla katakany, Wikipedia pokazuje kolejność Unicode. Więc jeśli chcesz użyć klasy znaków regex, która złapała wszystkie katakany, przypuszczam, że możesz zrobić coś takiego:

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

Hiragana, jeśli to coś warte:

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

Byłabym zaskoczona, gdyby jakikolwiek regex mógł wykryć łamanie japońskich słów.

 3
Author: Brian Carper,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-06-23 17:37:53

Dla znaków międzynarodowych musisz użyć klas znaków Java, coś w rodzaju [\p {javaLowerCase}\p{javaUpperCase}]+, aby dopasować dowolny znak wyrazu... \w jest używane do ASCII-patrz java.util.Dokumentacja Regex

 2
Author: Alex Ott,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-06-23 12:39:04

Przedrostek regex z (?U) w ten sposób: (re-matches #"(?U)\w+" "ñé2_hi") => "ñé2_hi".

Ustawia znacznik UNICODE_CHARACTER_CLASS na true, tak aby typowe klasy znaków wykonywały to, co chcesz z Unicode innym niż ASCII.

Zobacz tutaj, aby uzyskać więcej informacji: http://docs.oracle.com/javase/8/docs/api/java/util/regex/Pattern.html#UNICODE_CHARACTER_CLASS

 1
Author: cap10morgan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-02-02 16:49:42