如何将Unicode转义序列转换为.NETstring中的Unicode字符?

假设你已经将一个文本文件加载到一个string中,并且你希望将所有Unicode转义符转换成string内的实际Unicode字符。

例:

“以下是Unicode'u2320'中整数字符的上半部分,这是下半部分'\ U2321'。”

答案很简单,适用于至less有几千个字符的string。

例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(); } ); 

第一个示例显示使用lambdaexpression式(C#3.0)进行的replace,第二个示例使用应与C#2.0一起工作的委托。

要打破这里发生的事情,首先我们创build一个正则expression式:

 new Regex( @"\\[uU]([0-9A-F]{4})" ); 

然后我们使用string“result”和一个匿名方法(第一个例子中的lambdaexpression式,第二个中的委托 – 委托也可以是一个常规方法)来调用Replace(),该方法转换在string中find的每个正则expression式。

Unicode转义处理是这样的:

 ((char) Int32.Parse(match.Value.Substring(2), NumberStyles.HexNumber)).ToString(); }); 

获取表示转义的数字部分的string(跳过前两个字符)。

 match.Value.Substring(2) 

使用Int32.Parse()parsing该string,该string采用Parse()函数应该预期的string和数字格式,在这种情况下是hex数字。

 NumberStyles.HexNumber 

然后我们将结果编号转换为Unicode字符:

 (char) 

最后,我们在Unicode字符上调用ToString(),这个string表示是传递给Replace()的值。

 .ToString() 

注意:您可以使用match参数的GroupCollection和正则expression式中的子expression式来捕获数字('2320'),而不是使用Substring调用来抓取要转换的文本,但是这更复杂,可读性更差。

重构一点:

 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 ()); 

这是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()) 

我想你最好把小字母加到你的正则expression式中。 它对我更好。

 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());