Jac*_*ack 13
我认为你能做的最好的事情就是使用一个规范化器,它将带有重音的unicode字符分成两个独立的字符.Java在课堂上包含了这个Normalizer
,请看这里.
例如,这将分裂
U+00C1 LATIN CAPITAL LETTER A WITH ACUTE
Run Code Online (Sandbox Code Playgroud)
成
U+0041 LATIN CAPITAL LETTER A
U+0301 COMBINING ACUTE ACCENT
Run Code Online (Sandbox Code Playgroud)
并且会为每个具有重音或其他变音符号的角色(http://en.wikipedia.org/wiki/Diacritic)执行此操作.
然后你可以检查结果CharSequence
是否有一些重音字符(这意味着硬编码)或者只是检查标准化版本是否等于起始版本,这意味着没有任何字符被分解.Java Normalizer
已经有了这个功能isNormalized(CharSequence src, Normalizer.Form form)
,但你应该查看各种可用表格,看看是否有适合你需求的表格.
编辑:如果你只需要基本的重音支持(比如èéàòù)你可以选择oedo选项,如果你需要全部支持所有现有的口音,那么对它们进行硬编码会很疯狂.
if (Pattern.matches(".*[éèàù].*", input)) {
....
}
Run Code Online (Sandbox Code Playgroud)
将您想要的任何重音添加到该列表中
正确的方法是使用normalize(str,NFD)
from java.text.Normalizer
,然后删除一般类别Mark \pM
或Non-Spacing Mark 的字符\p{Mn}
.Java不支持标准的Unicode属性\p{Diacritic}
,也可以使用它.请注意,并非所有变音符号都是非间距标记,反之亦然.
但是,这可能是错误的做法.如果您尝试进行不区分重音的字符串搜索和比较,正确的方法是将字符串保留原样.您需要创建一个UCA归类对象,其级别设置为1(或者更确切地说是PRIMARY),然后使用它来比较您的字符串.如果字符串在主要强度上比较相等,则忽略重音符号等内容.
下面是 Java中使用ICU的Collator类如何做到这一点的例子.如果你正在使用合适的UCA训练器,那么你就不必进行正常化; 他们为你照顾这个.
Perl中的这个答案使用两个UCA collator对象,一个主要强度完全忽略字符串搜索和比较的重音,另一个允许在二次强度下区分变音符号,这是Unicode的正常情况.
归档时间: |
|
查看次数: |
5999 次 |
最近记录: |