我有一个关于字符串归一化的问题,并且已经得到解答,但是问题是,我无法正确归一化需要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",请安装ojit_a(为什么要在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块(ᄐ ᅢ ᆼ,除去空格,这是防止浏览器对其进行标准化的位置)中得到的字母,您可以重新组合这些字符正好。

Unicode 5.2状态:



这表明NFKC应该通过将它们视为常规Jamo来正确组合它们,但是Windows似乎没有这样做。但是,使用NFKD确实可以将它们转换为普通Jamo,然后可以在其上运行NFKC以获得正确的字符。

由于这些字符似乎来自外部程序(IME),因此我建议您要么手动进行转换以转换那些兼容Jamo,要么先执行NFKD,然后执行NFKC。或者,您可以将IME重新配置为输出“正常” Jamo,而不是兼容性Jamo。

关于windows - 这是bug(Windows API)吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3137335/

10-10 00:34