C# 如何将Unicode转义序列转换为.NET字符串中的Unicode字符?

C# 如何将Unicode转义序列转换为.NET字符串中的Unicode字符?,c#,.net,unicode,C#,.net,Unicode,假设您已将文本文件加载到字符串中,并且希望将所有Unicode转义转换为字符串中的实际Unicode字符 例如: 以下是Unicode“\u2320”中整型字符的上半部分,这是下半部分“\U2321” 答案很简单,可以很好地处理至少几千个字符的字符串 match.Value.Substring(2) 例1: Regex rx = new Regex( @"\\[uU]([0-9A-F]{4})" ); result = rx.Replace( result, match => ((ch

假设您已将文本文件加载到字符串中,并且希望将所有Unicode转义转换为字符串中的实际Unicode字符

例如:

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


答案很简单,可以很好地处理至少几千个字符的字符串

match.Value.Substring(2)
例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})" );
然后我们使用字符串“result”和一个匿名方法(第一个示例中是lambda表达式,第二个示例中是委托-委托也可以是正则方法)调用Replace(),该方法转换字符串中找到的每个正则表达式

Unicode转义的处理方式如下:

((char) Int32.Parse(match.Value.Substring(2), NumberStyles.HexNumber)).ToString(); });
获取表示转义的数字部分的字符串(跳过前两个字符)

使用Int32.Parse()解析该字符串,该字符串采用Parse()函数所期望的字符串和数字格式,在本例中为十六进制数

NumberStyles.HexNumber
然后将结果数字转换为Unicode字符:

(char)
最后,我们调用Unicode字符上的ToString(),它给出了它的字符串表示形式,即传递回Replace()的值:


注意:您可以使用match参数的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应区别对待--\u指定4个十六进制数字(16位),其中\u指定8(32位)--unicode码点的长度为21位。此外,您应该使用char.ConvertFromUtf32()方法,而不是强制转换。虽然当前的C语言规范指示\u为4个十六进制字节,\u为8个十六进制字节,\u只有4个十六进制数字,但我已经看到\u和\u以两种方式进行了记录。在任何情况下,\u的处理都是正确的。我必须检查ConvertFromUtf32()在功能上是否与强制转换不同。是的,我在意识到自己之后,阅读了文章第二部分中的ignorecase选项。还是谢谢你。:)这是一个精彩的答案!只有一点,在我的例子中,a-f字母是小写的,所以这可能更准确:var rx=new Regex(@“\[uU]([0-9A-Fa-f]{4}”);第一部分应该是result=rx.Replace(……而不是result=rxx.Replace(……我会自己修复它,但是stackoverflow不允许编辑少于6个字符,因为stackexchange高层认为他们比实际使用该站点的专业人员更了解。
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())