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

标签 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+ 中可用。 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/

相关文章:

sql - 数据库切换时出现错误 'Grid index out of range'

windows - 最小化其他应用程序的批处理文件

windows - 我无法在 Windows 上设置和配置 Common LISP (SBCL)

c++ - 如何减少 visual studio 非托管代码中的发布构建时间?

c# - 如何在不修改类的情况下添加XML序列化指令

c# - 在设计模式下进行编辑时 designer.vb 文件中的自定义代码消失

delphi - OnLoadEnd 从 Chromium 嵌入式框架调用多次

c# - 如何在不增加文件缓存的情况下将大文件复制到 Windows 中的网络共享/从网络共享复制? PowerShell 或 .NET,理想情况下

vb.net - 为什么 "ELSE : "在 vb.net 中编译?

c++ - Win32 RichEdit 垂直对齐段落