iva*_*var 12 unicode emacs clojure slime utf-8
这对你来说是一个双重问题,非常棒的Stacked Overflow Wizards.
如何在与Clojure交谈时将emacs/slime/swank设置为使用UTF-8,或者在命令行REPL中使用UTF-8?目前我无法向swank-clojure发送任何非罗马字符,并且使用命令行REPL会使事情变得糟糕.
在拉丁文本上做正则表达式真的很容易:
(re-seq#"[\ w] +""日语句子真的不需要空格吗?")
但是,如果我有一些日本人怎么办?我认为这会起作用,但我无法测试它:
(re-seq #"[(?u)\w]+" "??? ? ?? ? ? ???? ? ?? ?? ??? ???")
Run Code Online (Sandbox Code Playgroud)
如果我们必须使用字典来查找单词中断,或者自己找到一个只有片假名的单词,那就更难了:
(re-seq #"[?????-?]" "???????????????????????")
Run Code Online (Sandbox Code Playgroud)
谢谢!
j-g*_*tus 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
Run Code Online (Sandbox Code Playgroud)
\ w跳过扩展的字符.使用[(?u)\w]+相反没有区别,与日本人相同.
但请参阅此正则表达式引用:\p{L}匹配Letter类中的任何Unicode字符,因此它实际上适用于挪威语
(re-seq #"\p{L}+" "prøve")
=> ("prøve")
Run Code Online (Sandbox Code Playgroud)
以及日本人(至少我想是这样,我不能读它,但它似乎在球场):
(re-seq #"\p{L}+" "??? ? ?? ? ? ???? ? ?? ?? ??? ???")
=> ("???" "?" "??" "?" "?" "????" "?" "??" "??" "??" "??")
Run Code Online (Sandbox Code Playgroud)
还有很多其他选项,比如组合变音符号和诸如此类的匹配,请查看参考.
编辑:有关Java中的Unicode的更多信息
使用Unicode时,可以快速参考其他可能感兴趣的点.
幸运的是,Java通常能够以正确的位置和平台编码方式读取和写入文本,但有时您需要覆盖它.
这都是Java,大部分内容都没有Clojure包装(至少还没有).
Java字符/字符串在内部是UTF-16.该char类型(以及其包装字)为16位,这是不足够代表所有Unicode的,所以很多非拉丁文字需要两个字符来代表一个符号.
在处理非拉丁语Unicode时,使用code points而不是字符通常更好.代码点是一个表示为int的Unicode字符/符号.String和Character类具有在Java字符和Unicode代码点之间进行转换的方法.
我把它放在这里,因为我偶尔需要这些东西,但实际上不足以记住从一次到下一次的细节.对我未来的自我的一个注释,对于其他开始使用国际语言和编码的人来说也许是有用的.
我在这里回答半个问题:
如何在与Clojure交谈时将emacs/slime/swank设置为使用UTF-8,或者在命令行REPL中使用UTF-8?
更具互动性的方式:
或者将它放在你的.emacs中:
(custom-set-variables '(slime-net-coding-system (quote utf-8-unix)))
Run Code Online (Sandbox Code Playgroud)
这就是交互式菜单无论如何都会做的.
适用于Emacs 23并可在我的机器上运行