2010-06-29 70 views
3

我有一个关于字符串规范化的问题,它已经回答了,但问题是,我不能正确地规范需要3个键击的韩文字符
随着输入“ㅁㅜㄷ”(来自击键“ane”),它出来“무ㄷ”而不是“묻”。
使用输入“ㅌㅐㅇ”(来自击键“xod”),它会显示“태ㅇ”而不是“탱”。这是一个错误(Windows API)?

这是迪安先生的回答,虽然它的工作起初我给了我的例子......它不适用于我上面引用的那个。

如果您使用的是.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上使用它(为什么它是在国际化域名下载,我不明白...)

请注意,这些方法实际上都不需要使用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版本?

+0

打字탱适合我;你是否正在讨论一个专门用编程方式规范化的问题?如果是这样,你的第一段似乎意味着其他情况。 – 2010-06-29 01:58:15

+0

以编程方式进行规范化。我指的是在我的编辑框中输入(我得到我的输入)。好的,我会试着更清楚地重述它。 – Dian 2010-06-29 02:12:22

回答

2

您正在使用的jamo(ㅌㅐㅇ)位于名为Hangul Compatibility Jamo的块中,该块由于遗留代码页而存在。如果你要将目标角色分解并使用NFKD进行分解,你可以从Hangul Jamoᄐ ᅢ ᆼ,这个空格就是为了防止浏览器正常化)而得到jamo,并且这些可以被重新组合正好。

Unicode 5.2状态:

当朝鲜文兼容性JAMO是 具有兼容性 正常化形式,NFKD或NFKC改造, 字符被转换为对应的JAMO conjoining 字符 。

(...)

表12-11 示出了如何2个韩文 兼容性JAMO可以 显示即使NFKD或NFKC转化他们 后分离,。

这表明NFKC应通过将它们视为常规Jamo来正确地结合它们,但Windows似乎并没有这样做。但是,使用NFKD似乎会将它们转换为正常的Jamo,然后您可以在其上运行NFKC以获取正确的字符。由于这些字符看起来来自外部程序(IME),所以我建议你要么手动传递来转换这些兼容性的Jamo,要么先做NFKD,然后开始做NFKC。或者,您可以重新配置IME以输出“普通”Jamo而不是可互换性Jamo。

+0

由于一些奇怪的原因,我canoot让NFKC在NFKD后工作(它只是拒绝再次正常化)。我不能让我的IME(韩国输入系统IME 2002)输出正常的jamo,我正在考虑替换它,但我仍然试图弄清楚如何安装我的下载(我无法理解韩语!) 谢谢你的回答! – Dian 2010-06-30 00:55:04