Java字符串文本规范化器可复制日语字符

时间:2019-06-24 11:17:46

标签: java string

我有一个更改字符串字符的项目。当我将以下代码与日语字符一起使用时,结果字符串中有重复字符。我该如何解决?

@Test
public void testJapaneseCharacters() {
    String test = "카디코이";
    String replacedStr = Normalizer.normalize(test, Normalizer.Form.NFD).replaceAll("\\p{Mn}", "");
    Assert.assertEquals(test.length(),replacedStr.length());
}

输出:

java.lang.AssertionError: 
Expected :4
Actual   :8

1 个答案:

答案 0 :(得分:1)

日语字符代表音节,而不是单个语音。因此,大多数字符代表两个或三个“拉丁”字符。请参见Unicode Norma 1 Introduction部分的第一个黄色块

  

Unicode标准定义了字符之间的两个等效项:规范等效项和兼容性等效项。规范对等是字符或字符序列之间的基本对等。下图说明了这种等效性:

enter image description here

所以将两个字符合二为一是正确的行为。

但是,您选择了NFD形式,该形式已经说过“规范分解”。 我认为您不必删除\\p{Mn},因为您根本不了解规范的构成。

  

NFC   规范分解,然后是规范组成。

     

NFD   规范分解。

     

NFKC   兼容性分解,然后是规范组成。

     

NFKD   兼容性分解。

您测试的假设不正确,输入和输出序列的长度不必相同。