2013-07-23 29 views
3

我必須將大量字符轉換爲它們的Unicode代碼點等價物。我用下面的代碼來做到這一點的轉換:將字符串轉換爲其代碼點

string sample = "b"; 
int utf32 = char.ConvertToUtf32(sample, 0); 
string codePoint = string.Format("{0:X}", utf32); 

這適用於比較正常的人物,不過那時候我也喜歡這些在實際字符串是包含2個字符a (U-0061)'̌' (U-030C)字符。函數ConverToUtf32(string, int)那裏只返回我實際上期待的第一個(或另一個取決於索引)字符U-0103。使用ConvertToUtf32(char, char)不起作用,因爲這需要更高代碼點的字符。

是否有另一個函數可以用來將字符串轉換爲其代碼點,或者我可以執行的計算?

回答

7

我必須將大量的字符轉換爲它們的Unicode代碼點等價物。

這似乎不是你實際要求的。如果您有來自Basic Multilingual Plane(BMP)的字符,則每個char只對應一個代碼點。轉換爲UTF-32不會改變任何事情。

ConvertToUtf32()方法,特別是需要兩個char s的超載是用於處理不是來自BMP的代碼點。但這似乎並不是你所需要的。

您實際上似乎要求的是將normalize字符串轉換爲「規範化表單規範組合」(NFC)。要做到這一點,使用the string.Normalize() method

string decomposed = "\x0061\x030C"; 
string composed = decomposed.Normalize(NormalizationForm.FormC); 
foreach (char c in composed) 
    Console.WriteLine("U+{0:X4}", (int)c); 

這將打印「U + 01CE」,這是LATIN SMALL LETTER A WITH CARON,這似乎是你想要的。 (U + 030C是COMBINING CARON,所以結果是U + 01CE拉丁小寫字母A帶抑揚。如果你真的想U + 0103 LATIN SMALL LETTER A WITH BREVE,你將需要使用U + 0306 COMBINING BREVE代替。)

+0

偉大的答案,正是我需要!我開始正常化,但從來沒有意識到我需要它。 – 2013-07-23 09:57:45

+1

請注意,標準化表格C並不意味着「沒有組合標記」。 –

+0

謝謝,之後我發現了一個。如果我做得對,正常化似乎是在可能的情況下轉換爲[預先製作的字符](http://en.wikipedia.org/wiki/Precomposed_character)。但是,如果沒有,它會使它們保持分解狀態。我必須找出一個修改後的解決方案。 – user97462