繁体   English   中英

简单的规范化文本示例不起作用

[英]Simple Normalizing Text Example Does Not Work

我正在尝试分解一些文本。 此处的示例: 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\̈n"
  • NFKC: "schön"
  • NFKD: "scho\̈n"

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

在Eclipse JDT中使用Linux上的Oracle JDK 1.6或1.7安装时,此代码不起作用。

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

结果n始终为“schön”。

这种“问题”的气味类似于(1)我完全误解了此功能,或者(2)恶劣的环境。 我被困住了。 有什么建议么? 我的系统设置非常原始。

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

简而言之:

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")

将打印:

ÁÁ

只需执行此操作,它将完成以下工作:

String n = Normalizer.normalize("schön", Normalizer.Form.NFD).replaceAll("\\p{InCombiningDiacriticalMarks}+", "");

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM