这是一个错误(Windows API)吗?

时间:2010-06-29 01:51:30

标签: windows vb.net delphi winapi ime

我有一个关于字符串规范化的问题,它已经回答了,但问题是,我无法正确地规范化需要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版本?

1 个答案:

答案 0 :(得分:2)

您正在使用的jamo(ㅌㅐㅇ)位于名为Hangul Compatibility Jamo的块中,该块由于遗留代码页而存在。如果您要使用目标角色并对其进行分解(使用NFKD),则会从块Hangul Jamoᄐ ᅢ ᆼ中获取jamo,没有空格,这些空间只是为了阻止浏览器对其进行规范化) ,这些可以很好地重新组合。

Unicode 5.2州:

  

当Hangul兼容性jamo是   转换为兼容性   归一化形式,NFKD或NFKC,   字符转换为   相应的联合jamo   字符。

     

(...)

     

表12-11   说明两个韩文怎么样   兼容性jamo可以分开   显示,即使在转换它们之后   与NFKD或NFKC。

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

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