10

如何知道字符串是否包含重音符号?

4

3 回答 3

14

我认为你能做的最好的事情是使用一个规范器,将带有重音的 unicode 字符分成两个单独的字符。Java 在类中包含此内容Normalizer,请参见此处

例如,这将分裂

U+00C1    LATIN CAPITAL LETTER A WITH ACUTE

进入

U+0041    LATIN CAPITAL LETTER A
U+0301    COMBINING ACUTE ACCENT

并对每个有重音符号或其他变音符号的字符(http://en.wikipedia.org/wiki/Diacritic)执行此操作。

然后你可以检查结果CharSequence是否有一些重音字符(这意味着对它们进行硬编码)或者只是检查规范化版本是否等于起始版本,这意味着没有任何字符被分解. JavaNormalizer已经在 中提供了这种功能isNormalized(CharSequence src, Normalizer.Form form),但是您应该检查各种可用的表格,看看是否有一种适合您的需要。

编辑:如果您只需要基本的口音支持(例如 è é à ò ì ù),您可以使用 oedo 选项,如果您需要对所有现有口音的完全支持,那么硬编码它们会很疯狂。

于 2010-05-05T15:02:00.410 回答
7
if (Pattern.matches(".*[éèàù].*", input)) {
  ....
}

将您想要的任何口音添加到该列表中

于 2010-05-05T15:02:36.970 回答
5

正确的做法是使用normalize(str,NFD)from java.text.Normalizer,然后删除一般类别 Mark\pM或 Non-Spacing Mark的字符\p{Mn}。Java 不支持标准的 Unicode 属性\p{Diacritic},或者您可以使用它。请注意,并非所有变音符号都是非间距标记,反之亦然。

但是,这可能是错误的做法。如果您尝试进行不区分重音的字符串搜索和比较,那么正确的做法是让字符串保持原样。您需要创建一个级别设置为 1(或者更确切地说是 PRIMARY)的 UCA 归类对象,然后使用它来比较您的字符串。如果字符串在主要强度上比较相等,它会忽略重音符号之类的东西。

以下是Java 中的示例,说明如何使用 ICU 的 Collat​​or 类来做到这一点。如果您使用正确的UCA collat​​ors,那么您不必进行规范化;他们会为您解决这个问题。

Perl 中的这个答案使用了两个 UCA 整理器对象,一个主要优势是完全忽略字符串搜索和比较的重音符号,另一个允许像 Unicode 一样以次要优势区分变音符号。

于 2011-03-05T11:14:50.090 回答