我有一个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。