2010-06-29 57 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