【问题标题】:How to properly Normalize a String with composite characters?如何使用复合字符正确规范化字符串?
【发布时间】:2018-01-22 15:32:31
【问题描述】:

Java Normalize 已经允许我使用重音字符并输出非重音字符。但是,它似乎根本不能很好地处理复合字符(Œ、Æ)。

Java 有没有办法原生处理这些字符?我想避免保留这些字符的 Map(因为这就是我们首先使用 Normalize 的原因)。

例如,“Œ”的输入应该返回“OE”,就像它已经将“½”等字符整齐地分解为“1/2”一样。

【问题讨论】:

  • 请详细说明然而,它似乎根本不能很好地处理复合字符(Œ,Æ)
  • @SotiriosDelimanolis 我认为他希望Normalizer.normalize("Œ", Normalizer.Form.NFD).equals("OE"); 是真实的。我也是。
  • @SotiriosDelimanolis 我希望这可以澄清它:)
  • @DodgyCodeException 哼,这似乎还不够(结果我也得到了空字符串)
  • @WeckarE。我知道,从某种意义上说,它告诉您它无法解决;-)

标签: java unicode-normalization


【解决方案1】:

TLDR; 不,原生 java 无法统一处理这些。

长答案

正如本问题Separating Unicode ligature characters 中所述,Java Normalizer 实现并不支持书面语言中存在的所有连字。

这是因为 Unicode 不支持书面语言中存在的所有连字。当涉及到书面语言的存储时,连字是一个有争议的话题,因为可以说它们从数据的角度来看并不重要,而从布局的角度来看它们很重要。

数据观点声称不会丢失任何信息,因此只使用分解后的表单更有意义,并且组合后的表单不应该是 Unicode。

布局观点声称,组合连字代表了书面语言形式的正确布局,因此应该在数据中用特殊代码表示。

可能的解决方案

我建议创建一个Service,它的接口只处理连字。提供一个具体的实现来处理您当前需要的所有内容。将来如果需要新的实现,可以很容易地添加它们,而无需修改原始代码,只需将新的 JAR 添加到添加缺失连字的程序类路径即可。

骨架实现可能如下所示。

请注意,我省略了实际使用ServiceLoader 来定位LigatureDecoderLigatureEncoder 实现的代码。

final class Ligatures {
  public static CharSequence compose ( CharSequence decomposedCharacters );
  public static CharSequence decompose ( CharSequence composedCharacters );
}

interface LigatureDecoder {
  CharSequence decompose ( CharSequence composedCharacters );
}

interface LigatureEncoder {
  CharSequence compose ( CharSequence decomposedCharacters );
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-10
    • 1970-01-01
    • 2019-09-24
    • 2018-09-29
    • 2020-02-12
    • 2012-04-25
    • 2019-04-19
    相关资源
    最近更新 更多