我有一个关于字符串规范化的问题,它已经得到解答,但问题是,我无法正确规范化需要 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+ 中可用。 You need the "Microsoft Internationalized Domain Name (IDN) Mitigation APIs"如果您想在 XP 上使用它,请安装它(为什么它在 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 版本?
最佳答案
您正在使用的 jamo (ㅌㅐㅇ
) 位于名为 Hangul Compatibility Jamo 的 block 中,这是由于遗留代码页而存在的。如果你要获取你的目标角色并将其分解(使用 NFKD),你会从 block 中得到 jamo Hangul Jamo (ᄐ ᅢ ᆼ
,没有空格,只是为了防止浏览器对其进行规范化),这些可以重新组合。
Unicode 5.2状态:
When Hangul compatibility jamo are transformed with a compatibility normalization form, NFKD or NFKC, the characters are converted to the corresponding conjoining jamo characters.
(...)
Table 12-11 illustrates how two Hangul compatibility jamo can be separated in display, even after transforming them with NFKD or NFKC.
这表明 NFKC 应该通过将它们视为常规 Jamo 来正确组合它们,但 Windows 似乎并没有这样做。但是,使用 NFKD 似乎确实可以将它们转换为普通的 Jamo,然后您可以在其上运行 NFKC 以获得正确的字符。
由于这些字符似乎来自外部程序(IME),我建议您要么手动传递以转换那些兼容性 Jamo,要么先执行 NFKD,然后执行 NFKC。或者,您可以重新配置 IME 以输出“正常”Jamo 而不是兼容 Jamo。
关于windows - 这是一个错误(Windows API)吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3137335/