2010-06-23 19 views
12

這是一個雙重問題,你驚人地親切堆疊溢出奇才那裏。如何在Clojure正則表達式中使用unicode(UTF-8)字符?

  1. 如何設置emacs的/淤泥/斯旺克使用Clojure交談時使用UTF-8,或者在命令行REPL使用UTF-8?目前我無法將任何非羅馬字符發送給swank-clojure,並且使用命令行REPL來弄亂東西。

  2. 這是很容易做到的拉丁文本的正則表達式:

    (?再以次#「[\ W] +」「是日語句子無需空格這是真的」)

但是如果我有一些日本人呢?我認爲這會工作,但我不能測試:

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

如果我們要使用字典查找單詞分解,或自己給自己找一個只有片假名單詞就更困難了:

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

謝謝!

回答

15

不能幫助swank或Emacs,恐怕。我在NetBeans上使用Enclojure,它在那裏工作得很好。

匹配:正如亞歷克斯說,\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]+則沒有區別。

但見this regex reference\p{L}比賽類別信任何Unicode字符,因此它的實際工作對挪威

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

以及日本(至少我想是這樣,我不能讀它,但它似乎是在球場):

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

有許多其他的選擇,像組合語音標記和諸如此類的東西匹配,檢查出的參考。

編輯:使用Unicode工作時更多的Unicode在Java中

的快速參考可能感興趣的其他問題。

幸運的是,Java通常在正確的位置和平臺編碼中對文本進行閱讀和書寫的工作非常出色,但有時您需要重寫它。

這是所有的Java,大部分這些東西沒有Clojure包裝(至少現在還沒有)。

Java字符/字符串在內部是UTF-16。 char類型(及其包裝字符)是16位,不足以表示所有的Unicode,所以很多非拉丁腳本需要兩個字符來表示一個符號。

在處理非拉丁Unicode時,通常最好使用code points而不是字符。代碼點是一個用int表示的Unicode字符/符號。字符串和字符類具有用於在Java字符和Unicode代碼點之間轉換的方法。

我把這個放在這裏,因爲我偶爾需要這些東西,但是往往不足以真正記住從一次到另一次的細節。爲我未來的自我排序,對於其他從國際語言和編碼開始的其他人也可能有用。

+2

不錯!是的,\ p {L}開關正是我想要的,實際上我對它在日本的工作感到有點驚訝。感謝您的鏈接。 – ivar 2010-06-24 03:59:29

2

對於國際字符,您需要使用Java字符類,如[\ p {javaLowerCase} \ p {javaUpperCase}] +來匹配任何字符... \ w用於ASCII - 參見java.util。正則表達式文檔

3

對於片假名,Wikipedia顯示Unicode排序。所以,如果你想使用,所有被捕的片假名一個正則表達式字符類,我想你可以做這樣的事情:

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

平假名,對於它的價值:

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

我會如果有任何正則表達式可以檢測到日語單詞中斷,那麼相當驚訝

+0

感謝您的幫助,日語閱讀牛先生。^_ ^同意,可以檢測日語單詞的正則表達式是絕對不可思議的。 – ivar 2010-06-24 03:57:25

8

我會回答這裏半個問題:

如何設置emacs的/淤泥/斯旺克使用Clojure交談時使用UTF-8,或者在命令行REPL使用UTF-8?

更互動的方式:

  1. M-X自定義組
  2. 「煤泥口齒不清」
  3. 查找煤泥編碼系統的選項,選擇UTF-8-UNIX。保存這個以便Emacs在你的下一個會話中選擇它。

或者把它放在你的。emacs的:

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

這就是交互式菜單會做呢。

工程上的Emacs 23和works on my machine

相關問題