Java字符串文本规范化程序双精度韩语字符

Java字符串文本规范化程序双精度韩语字符,java,string,Java,String,我有一个改变字符串的项目。当我将以下代码与韩文字符一起使用时,结果字符串具有双重字符。我怎样才能修好它 @Test public void testKoreanCharacters() { String test = "카디코이"; String replacedStr = Normalizer.normalize(test, Normalizer.Form.NFD).replaceAll("\\p{Mn}", ""); Assert.assertEquals(test.

我有一个改变字符串的项目。当我将以下代码与韩文字符一起使用时,结果字符串具有双重字符。我怎样才能修好它

@Test
public void testKoreanCharacters() {
    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

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

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

因此,将一个字符变成两个字符是正确的行为

然而,您选择了NFD形式,它已经是“规范分解”。 我认为您不必删除
\\p{Mn}
,因为您根本无法获得规范组合

NFC 标准分解,然后是标准组合

NFD 正则分解

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

NFKD 兼容性分解


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

感谢您根据您的回答做出的回答。我如何才能用一个字符更改所有日语字符?您不能。除了unicode字符本身之外,没有表示日语字符的单数字符。所有其他表示都是字符分解或语音表示,它们都更长。您的项目的目的是什么?我的项目的目的只是向tcp服务器发送一个字符串。Tcp服务器以字符串形式接收请求,且字符串长度为常量。日文字符不重要当我发现日文或中文字符时,我必须用拉丁字符替换日文字符。此外,我还必须使用这些规范化方法,因为如果字符串具有土耳其字符,我必须将其更改为英语,例如,ç->c,就像您的屏幕截图一样。在这种情况下,您可以使用
“\uffffd”
替换您感兴趣的范围之外的字符,这是不在字符集中的字符的替换字符。它的长度为1,但不在ascii范围内。然而,如果您计划将它们作为get请求发送,它们可能不会作为URL的一部分保存……您的意思是这样使用吗?Normalizer.normalize(test,Normalizer.Form.NFD).replaceAll(“\\p{Mn}”,“\uffffd”);测试字符串“카디코이" 是韩国人,不是日本人我很抱歉。我更新了问题。