2

我正在尝试分解一些文本。此处的示例:http: //docs.oracle.com/javase/6/docs/api/java/text/Normalizer.html

  U+00C1    LATIN CAPITAL LETTER A WITH ACUTE (Á)

或作为两个单独的字符(“分解”形式):

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

我正在关注 Oracle 的本教程页面:http: //docs.oracle.com/javase/tutorial/i18n/text/normalizerapi.html

这个简单的案例对我不起作用:

  • 原话:"schön"
  • NFC:"schön"
  • NFD:"scho\u0308n"
  • NFKC:"schön"
  • NFKD:"scho\u0308n"

在上述所有情况下,函数Normalizer.normalize("schön", form)(其中形式是 、 等之一Normalizer.Form.NFCNormalizer.Form.NFD,结果是相同的:"schön"

此代码不适用于我在 Linux 上的 Oracle JDK 1.6 或 1.7 安装,在 Eclipse JDT 中使用。

String n = Normalizer.normalize("schön", Normalizer.Form.NFD);

结果n总是“schön”。

这个“问题”听起来像是(1)我完全误解了这个功能,或者(2)环境不好。我被困住了。有什么建议么?我的系统设置非常简单。

4

2 回答 2

3

归功于@R.MartinhoFernandes。我不知道结果将规范地等同于输入。我今天学到了一些关于 Unicode de/composition 的新知识。

简而言之:

String.valueOf('Á').equals(String.valueOf('\u00C1'))
String.valueOf('A').equals(String.valueOf('\u0041'))

和:

Normalizer.normalize("Á", Normalizer.Form.NFD).equals("\u0041\u0301")
!String.valueOf('Á').equals("\u0041\u0301")

但:

System.out.println("Á\u0041\u0301")

将打印:

ÁÁ
于 2013-07-25T13:53:24.697 回答
1

只需这样做,它就会完成这项工作:

String n = Normalizer.normalize("schön", Normalizer.Form.NFD).replaceAll("\\p{InCombiningDiacriticalMarks}+", "");
于 2015-11-04T08:56:50.287 回答