pvo*_*orb 6 java regex unicode scala read-eval-print-loop
我想检测Unicode Letters(\p{L}
)的单词.
Scala的REPL给出false
了以下语句,而在Java中它是true
(这是正确的行为):
java.util.regex.Pattern.compile("\\p{L}").matcher("ä").matches()
Java和Scala都在JRE 1.7中运行:
System.getProperty("java.version")
回馈 "1.7.0_60-ea"
可能是什么原因?
解释器中可能使用了不兼容的字符编码。例如,这是我的输出:
scala> System.getProperty("file.encoding")
res0: String = UTF-8
scala> java.util.regex.Pattern.compile("\\p{L}").matcher("ä").matches()
res1: Boolean = true
Run Code Online (Sandbox Code Playgroud)
因此,解决方案是scala
使用-Dfile.encoding=UTF-8
。但是请注意,此博客文章(有点旧):
我们发现为Scala设置默认字符编码的唯一可靠方法是在运行应用程序之前设置$ JAVA_OPTS:
$ JAVA_OPTS="-Dfile.encoding=utf8" scala
[...]只是尝试设置scala -Dfile.encoding=utf8
似乎没有做到。[...]
这里不是这种情况,但也可能发生:或者,您的“ä”可能是音调(变音符号),后跟“ a”,例如:
scala> println("a\u0308")
ä
scala> java.util.regex.Pattern.compile("\\p{L}").matcher("a\u0308").matches()
res1: Boolean = false
Run Code Online (Sandbox Code Playgroud)
在某些通过Unicode组合字符创建变音符号的系统上,这有时是个问题(我认为OS X至少在某些版本中是一个)。有关更多信息,请参阅Paul的问题。