我有一个关于字符串规范化的问题,它已经回答了,但问题是,我无法正确地规范化需要3次击键的韩语字符
使用输入“ㅁㅜㄷ”(从击键“ane”),它出现“무ㄷ”而不是“묻”。
输入“ㅌㅐㅇ”(来自击键“xod”),输出“태ㅇ”而不是“탱”。
这是Dean先生的答案,虽然它起初是我给出的例子......但它与我上面引用的那个不一致。
如果您使用的是.NET,则以下内容将起作用:
var s = "ㅌㅐㅇ";
s = s.Normalize(NormalizationForm.FormKC);
在原生Win32中,相应的调用是NormalizeString:
wchar_t *input = "ㅌㅐㅇ";
wchar_t output[100];
NormalizeString(NormalizationKC, input, -1, output, 100);
NormalizeString仅在Windows Vista +中可用。如果你想在XP上使用它,那就安装了You need the "Microsoft Internationalized Domain Name (IDN) Mitigation APIs"(为什么它在IDN下载中,我不明白......)
请注意,这些方法实际上都不需要使用IME - 无论您是否安装了韩语IME,它们都能正常工作。
这是我在delphi中使用的代码(使用XP):
var buf: array [0..20] of char;
temporary: PWideChar;
const NORMALIZATIONKC=5;
...
temporary:='ㅌㅐㅇ';
NormalizeString(NORMALIZATIONKC , temporary, -1, buf, 20);
showmessage(buf);
这是一个错误吗?我的代码中有什么不正确的地方吗? 代码是否在您的计算机上正确运行?用什么语言?您使用的是什么Windows版本?
答案 0 :(得分:2)
您正在使用的jamo(ㅌㅐㅇ
)位于名为Hangul Compatibility Jamo的块中,该块由于遗留代码页而存在。如果您要使用目标角色并对其进行分解(使用NFKD),则会从块Hangul Jamo(ᄐ ᅢ ᆼ
中获取jamo,没有空格,这些空间只是为了阻止浏览器对其进行规范化) ,这些可以很好地重新组合。
当Hangul兼容性jamo是 转换为兼容性 归一化形式,NFKD或NFKC, 字符转换为 相应的联合jamo 字符。
(...)
表12-11 说明两个韩文怎么样 兼容性jamo可以分开 显示,即使在转换它们之后 与NFKD或NFKC。
这表明NFKC应该通过将它们视为常规Jamo来正确组合它们,但Windows似乎并没有这样做。但是,使用NFKD似乎确实将它们转换为正常的Jamo,然后您可以在其上运行NFKC以获得正确的角色。
由于这些字符似乎来自外部程序(IME),我建议你做一个手动传递来转换那些兼容性的Jamo,或者从做NFKD开始,然后是NFKC。或者,您可以重新配置IME以输出“正常”Jamo而不是可兼容的Jamo。