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.
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.
-
Bardzo łatwo jest wykonywać wyrażenia regularne w tekście łacińskim:
(re-seq # "[\w]+ "" to prawda, że Japońskie zdania nie potrzebujesz spacji?")
(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! 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.
- unicode.org - the Standard Unicode i wykresy kodów.
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ż.
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:
- m-x customize-group
- "slime-lisp"
- 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
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.
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
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
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