我有一个更改字符串字符的项目。当我将以下代码与日语字符一起使用时,结果字符串中有重复字符。我该如何解决?
@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
答案 0 :(得分:1)
日语字符代表音节,而不是单个语音。因此,大多数字符代表两个或三个“拉丁”字符。请参见Unicode Norma 1 Introduction
部分的第一个黄色块
Unicode标准定义了字符之间的两个等效项:规范等效项和兼容性等效项。规范对等是字符或字符序列之间的基本对等。下图说明了这种等效性:
所以将两个字符合二为一是正确的行为。
但是,您选择了NFD形式,该形式已经说过“规范分解”。
我认为您不必删除\\p{Mn}
,因为您根本不了解规范的构成。
NFC 规范分解,然后是规范组成。
NFD 规范分解。
NFKC 兼容性分解,然后是规范组成。
NFKD 兼容性分解。
您测试的假设不正确,输入和输出序列的长度不必相同。