当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《如何将Unicode转义序列转换为.NET字符串中的Unicode字符?》经验,为你挑选了3个好方法。

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

例:

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

jr... 45

答案很简单,适用于至少有几千个字符的字符串.

例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'调用Replace()和一个匿名方法(第一个示例中的lambda表达式和第二个中的委托 - 委托也可以是常规方法),它转换在字符串中找到的每个正则表达式.

Unicode转义处理如下:

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

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

match.Value.Substring(2)

使用Int32.Parse()解析该字符串,该字符串采用字符串和Parse()函数应该期望的数字格式,在这种情况下是十六进制数字.

NumberStyles.HexNumber

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

(char)

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

.ToString()

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



1> jr...:

答案很简单,适用于至少有几千个字符的字符串.

例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'调用Replace()和一个匿名方法(第一个示例中的lambda表达式和第二个中的委托 - 委托也可以是常规方法),它转换在字符串中找到的每个正则表达式.

Unicode转义处理如下:

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

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

match.Value.Substring(2)

使用Int32.Parse()解析该字符串,该字符串采用字符串和Parse()函数应该期望的数字格式,在这种情况下是十六进制数字.

NumberStyles.HexNumber

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

(char)

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

.ToString()

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


\ u和\ U应区别对待 - \u指定4个十六进制数字(16位),其中\ U指定8(32位) - unicode代码点长度为21位.此外,您应该使用char.ConvertFromUtf32()方法而不是强制转换.
这是一个很棒的答案!只有一点,在我的情况下,字母是小写的,所以这可能更准确:var rx = new Regex(@"\\ [uU]([0-9A-Fa-f] {4})");

2> George Tsiok..:

重构了一点:

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



3> Tarık Özgün ..:

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

推荐阅读
女女的家_747
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有