这是一个错误(Windows API)?

我有一个string规范化的问题,它已经被回答了,但问题是,我不能正确地规范化韩文字符,需要3个按键
用input“ㅁㅜㄷ”(从击键“ane”),输出“무ㄷ”而不是“묻”。
用input“ㅌㅐㅇ”(从击键“xod”),输出“태ㅇ”而不是“탱”。

这是迪安先生的回答,虽然它起初对我给的例子的工作…它不符合我上面引用的那个。

如果您使用.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 +中可用。 你需要安装“微软国际化域名(IDN)缓解API”,如果你想在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”的块中,由于遗留代码页,因此存在。 如果你要把你的目标角色分解(使用NFKD),你可以从Hangul Jamo块中获得jamo( ᄐ ᅢ ᆼ the the spaces spaces spaces spaces spaces to to to to to browser browser browser browser browser browser),and and and and)重新组成就好了。

Unicode 5.2指出:

当使用兼容性规范化形式NFKD或NFKC转换Hangul兼容性jamo时,字符将转换为相应的联合jamo字符。

(……)

表12-11说明了如何将两个Hangul兼容性jamo在显示中分开,即使在使用NFKD或NFKC进行转换之后。

这表明NFKC应该将它们正确地结合起来,将它们视为常规的Jamo,但是Windows似乎并没有这样做。 但是,使用NFKD似乎会将它们转换为正常的Jamo,然后您可以运行NFKC来获取正确的字符。

由于这些字符似乎来自外部程序(IME),所以我建议你要么手动传递来转换这些兼容性的Jamo,要么开始做NFKD,然后NFKC。 或者,您可能能够重新配置IME输出“普通”Jamo而不是可互换性Jamo。