假設你已經將一個文本文件加載到一個字符串中,並且你希望將所有Unicode轉義符轉換爲字符串內的實際Unicode字符。如何將Unicode轉義序列轉換爲.NET字符串中的Unicode字符?
實施例:
「下面是以Unicode‘\ u2320’的組成字符的上半部分,這是下半部‘\ U2321’」
假設你已經將一個文本文件加載到一個字符串中,並且你希望將所有Unicode轉義符轉換爲字符串內的實際Unicode字符。如何將Unicode轉義序列轉換爲.NET字符串中的Unicode字符?
實施例:
「下面是以Unicode‘\ u2320’的組成字符的上半部分,這是下半部‘\ U2321’」
答案很簡單,適用於至少有幾千個字符的字符串。
實施例1:
Regex rx = new Regex(@"\\[uU]([0-9A-F]{4})");
result = rx.Replace(result, match => ((char) Int32.Parse(match.Value.Substring(2), NumberStyles.HexNumber)).ToString());
實施例2:
Regex rx = new Regex(@"\\[uU]([0-9A-F]{4})");
result = rx.Replace(result, delegate (Match match) { return ((char) Int32.Parse(match.Value.Substring(2), NumberStyles.HexNumber)).ToString(); });
第一個例子示出了使用一個lambda表達式(C#3.0)和第二所取得的替換使用委託它應與工作C#2.0。
要打破這是怎麼回事就在這裏,我們首先創建一個正則表達式:
new Regex(@"\\[uU]([0-9A-F]{4})");
然後我們調用替換()以字符串「結果」和匿名方法(在第一個例子lambda表達式和第二個委託 - 委託也可以是常規方法),它轉換字符串中找到的每個正則表達式。
Unicode轉義被處理這樣的:
((char) Int32.Parse(match.Value.Substring(2), NumberStyles.HexNumber)).ToString(); });
獲取表示所述逃逸的數目部分(跳過前兩個字符)的字符串。
match.Value.Substring(2)
解析使用Int32.Parse(),接受字符串並且該parse()函數應該期望在這種情況下是一個十六進制數的數字格式的字符串。
NumberStyles.HexNumber
然後我們投得到的數字爲Unicode字符:
(char)
最後,我們調用toString()的Unicode字符這給了我們這是值傳遞迴替換它的字符串表示():
.ToString()
注意:不能抓住文字,與子串調用你可以使用匹配參數的GroupCollection進行轉換,並在子表達式正則表達式僅捕獲數字('2320'),但這更復雜,可讀性更差。
重構多一點:
Regex regex = new Regex (@"\\U([0-9A-F]{4})", RegexOptions.IgnoreCase);
string line = "...";
line = regex.Replace (line, match => ((char)int.Parse (match.Groups[1].Value,
NumberStyles.HexNumber)).ToString());
我想你最好的小寫字母添加到您的正則表達式。它對我更好。
Regex rx = new Regex(@"\\[uU]([0-9A-Fa-f]{4})");
result = rx.Replace(result, match => ((char) Int32.Parse(match.Value.Substring(2), NumberStyles.HexNumber)).ToString());
這是VB.NET當量:
Dim rx As New RegularExpressions.Regex("\\[uU]([0-9A-Fa-f]{4})")
result = rx.Replace(result, Function(match) CChar(ChrW(Int32.Parse(match.Value.Substring(2), Globalization.NumberStyles.HexNumber))).ToString())
\ u和\ü應該區別對待 - \ u指定4個十六進制數字(16個比特),其中\ U指定8(32位) - 一個unicode碼點長度爲21位。另外,您應該使用char.ConvertFromUtf32()方法而不是強制轉換。 – 2008-10-08 22:18:13