33

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

例子:

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

4

5 回答 5

49

答案很简单,并且适用于至少几千个字符的字符串。

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

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

match.Value.Substring(2)

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

NumberStyles.HexNumber

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

(char)

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

.ToString()

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

于 2008-10-08T17:32:18.420 回答
9

再重构一点:

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 ());
于 2009-01-20T18:54:36.130 回答
7

这是 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())
于 2012-10-30T15:36:12.573 回答
1

我认为您最好将小写字母添加到正则表达式中。它对我来说效果更好。

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());
于 2012-07-04T14:25:11.640 回答
1

UnicodeExtensions.cs类添加到您的项目中:

public static class UnicodeExtensions
{
    private static readonly Regex Regex = new Regex(@"\\[uU]([0-9A-Fa-f]{4})");

    public static string UnescapeUnicode(this string str)
    {
        return Regex.Replace(str,
            match => ((char) int.Parse(match.Value.Substring(2),
                NumberStyles.HexNumber)).ToString());
    }
}

用法:

var test = "\\u0074\\u0068\\u0069\\u0073 \\u0069\\u0073 \\u0074\\u0065\\u0073\\u0074\\u002e";
var output = test.UnescapeUnicode();   // output is => this is test.
于 2021-12-02T10:22:04.287 回答