如何在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=""javascript:alert(window.origin)"">X"; // 调用解码方法 string decodedOutput = WebUtility.HtmlDecode(encodedInput); // 输出结果:-9<ahref="javascript:alert(window.origin)">X Console.WriteLine(decodedOutput); } }
这个方法不仅能处理十六进制的&#xXX;实体,还能处理十进制的&#XXX;实体以及其他HTML转义字符(比如"),非常靠谱。
手动解析方案(不推荐,仅作了解)
如果你不想依赖官方工具类,也可以用正则表达式手动匹配并替换这些实体:
using System; using System.Text.RegularExpressions; class Program { static void Main() { string encodedInput = @"-9<ahref=""javascript:alert(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); } }
不过这个方法只处理十六进制实体,对其他转义字符(比如")无效,所以除非特殊需求,还是优先用官方工具类。
为啥不能用Encoding类?
再强调下:Encoding类的核心是处理字节序列和字符串之间的编码转换(比如把UTF-8字节数组转成字符串),而你要处理的是HTML文本的转义规则,属于完全不同的场景,所以找不到Encoding.{xxx}.GetString这种形式的方法来直接解决这个问题哦。
内容的提问来源于stack exchange,提问作者Shubhangi_sk




