You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在C#中将Unicode十六进制字符编码(如a)转换为普通字符串?

解决HTML Unicode十六进制实体解码问题(C#)

嘿,作为C#初学者碰到这种字符转义问题很正常,我来给你讲明白怎么搞定~

首先得澄清:你遇到的不是普通的字节编码(比如UTF-8、ASCII那种),而是HTML/XML的Unicode十六进制字符实体(比如a对应小写字母a)。这种编码是为了在HTML/XML里安全显示特殊字符,所以不能直接用Encoding类的方法——Encoding负责的是字节和字符串之间的转换,和这种标记语言的转义规则不是一回事。

最简便的解决方案:用官方工具类解码

.NET已经提供了现成的解码方法,分两种情况:

  • 如果你用的是**.NET Core/.NET 5+**(跨平台版本),直接用System.Net.WebUtility.HtmlDecode
  • 如果你用的是**.NET Framework**,可以用System.Web.HttpUtility.HtmlDecode(需要引用System.Web程序集)

代码示例(以跨平台的WebUtility为例):

using System;
using System.Net;

class Program
{
    static void Main()
    {
        // 你的原始编码字符串
        string encodedInput = @"-9<ahref=""j&#x61vascript:&#x61lert(window.origin)"">X";
        // 调用解码方法
        string decodedOutput = WebUtility.HtmlDecode(encodedInput);
        // 输出结果:-9<ahref="javascript:alert(window.origin)">X
        Console.WriteLine(decodedOutput);
    }
}

这个方法不仅能处理十六进制的&#xXX;实体,还能处理十进制的&#XXX;实体以及其他HTML转义字符(比如&quot;),非常靠谱。

手动解析方案(不推荐,仅作了解)

如果你不想依赖官方工具类,也可以用正则表达式手动匹配并替换这些实体:

using System;
using System.Text.RegularExpressions;

class Program
{
    static void Main()
    {
        string encodedInput = @"-9<ahref=""j&#x61vascript:&#x61lert(window.origin)"">X";
        // 匹配十六进制实体的正则
        string decodedOutput = Regex.Replace(encodedInput, 
            @"&#x([0-9A-Fa-f]+);", 
            match => char.ConvertFromUtf32(int.Parse(match.Groups[1].Value, System.Globalization.NumberStyles.HexNumber)));
        Console.WriteLine(decodedOutput);
    }
}

不过这个方法只处理十六进制实体,对其他转义字符(比如&quot;)无效,所以除非特殊需求,还是优先用官方工具类。

为啥不能用Encoding类?

再强调下:Encoding类的核心是处理字节序列和字符串之间的编码转换(比如把UTF-8字节数组转成字符串),而你要处理的是HTML文本的转义规则,属于完全不同的场景,所以找不到Encoding.{xxx}.GetString这种形式的方法来直接解决这个问题哦。

内容的提问来源于stack exchange,提问作者Shubhangi_sk

火山引擎 最新活动