如何将C#字符串转换为其UTF8编码字符的十六进制表示(字符间用空格分隔)
如何将C#字符串转换为其UTF8编码字符的十六进制表示(字符间用空格分隔)
你遇到的问题核心在于C#字符串是UTF-16编码的,直接遍历char会把那些需要两个代理字符组成的Unicode码点拆成两个独立元素,导致转换出的十六进制不符合预期。我来给你两种可行的解决方案,分别适配不同版本的.NET环境:
方案一:.NET 5+ 推荐用Rune类(最简洁可靠)
从.NET 5开始,C#引入了Rune类型,专门用来表示单个Unicode码点,完美解决代理对的问题。直接用它遍历字符串里的每个完整Unicode字符,再转成UTF8字节和十六进制:
using System; using System.Linq; using System.Text; public static class StringHexConverter { public static string ConvertToUtf8HexPerChar(string input) { if (string.IsNullOrEmpty(input)) return string.Empty; // 遍历每个Unicode码点(Rune) var hexParts = input.EnumerateRunes() .Select(rune => { // 分配对应长度的UTF8字节数组 var utf8Bytes = new byte[Rune.Utf8SequenceLength(rune)]; // 将Rune编码为UTF8字节 rune.EncodeToUtf8(utf8Bytes); // 把字节转成十六进制字符串,去掉默认的分隔符"-" return BitConverter.ToString(utf8Bytes).Replace("-", ""); }); // 用空格连接每个码点的十六进制串 return string.Join(" ", hexParts); } }
测试你的示例输入"$£€͈",调用这个方法会直接返回你想要的结果:"24 C2A3 E282AC F0908D88"。
方案二:兼容.NET Framework 4.x(用StringInfo处理文本元素)
如果还在使用老版本的.NET Framework,没有Rune的话,可以用StringInfo类来识别字符串里的每个完整Unicode文本元素:
using System; using System.Globalization; using System.Collections.Generic; using System.Text; public static class StringHexConverter { public static string ConvertToUtf8HexPerChar(string input) { if (string.IsNullOrEmpty(input)) return string.Empty; var stringInfo = new StringInfo(input); var hexParts = new List<string>(); // 遍历每个文本元素(即完整的Unicode字符) for (int i = 0; i < stringInfo.LengthInTextElements; i++) { // 取出单个Unicode字符 var singleChar = stringInfo.SubstringByTextElements(i, 1); // 转成UTF8字节数组 var utf8Bytes = Encoding.UTF8.GetBytes(singleChar); // 转十六进制并去掉分隔符 var hex = BitConverter.ToString(utf8Bytes).Replace("-", ""); hexParts.Add(hex); } return string.Join(" ", hexParts); } }
这个方案的原理和上面一致,只是用StringInfo来替代Rune的功能,同样能正确处理代理对的情况。
为什么不能直接遍历char?
再啰嗦两句:C#里的char是UTF-16编码的16位值,对于Unicode辅助平面的字符(比如你例子里的最后一个字符͈),需要两个char(高代理项+低代理项)才能表示一个完整的Unicode码点。如果直接foreach (char c in input),会把这两个char当成独立元素处理,转UTF8后得到的是错误的十六进制结果,而上面两种方案都会把它们识别为一个完整的Unicode字符,这才是你需要的效果。
备注:内容来源于stack exchange,提问作者Jez
相关产品推荐
相关产品推荐

