You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.17 10:44:27