如何获得c#字符串的UTF-8码点

本文关键字:UTF-8 码点 字符串 何获得 | 更新日期: 2023-09-27 18:01:46

我在c#中有一个德语字符串

string s = "Menü";

我想获得UTF-8代码点:

预期结果:

'x4D'x65'x6E'xC3'xBC

预期结果已通过在线UTF-8编码器/解码器和Unicode代码转换器v8.1验证

我尝试了很多转换方法,但我不能得到预期的结果。

更新:

有趣,问题不在源代码中,而是在输入文件中的错误编码:-)这些答案帮助了我很多。

如何获得c#字符串的UTF-8码点

没有"UTF-8码点"这种东西-有UTF-8码单位,或者Unicode码点。

在字符串Menü中,有4个代码点:

  • U + 004 d
  • U + 0065
  • U + 006 e
  • U + 00 fc

对于BMP字符(即那些在U+0000到U+FFFF范围内的字符),它就像迭代字符串中的char值一样简单。对于非bmp字符,这稍微有点棘手。StringInfo在这里看起来很有用,但它包括在迭代文本元素时组合字符。在字符串中发现代理对并不难,但我不认为有一种非常简单的方法可以遍历字符串中的所有代码点。

查找UTF-8代码单位 -即UTF-8编码的字符串表示为字节,很简单:

byte[] bytes = Encoding.UTF8.GetBytes(text);

这将为您提供您在问题中列出的五个字节:0x4d, 0x65, 0x6e, 0xc3, 0xbc。

使用Encoding.UTF8,示例如下。

        string menu = "Menü";
        Console.WriteLine(menu);
        var utf8 = Encoding.UTF8;
        byte[] utfBytes = utf8.GetBytes(menu);
        foreach(byte b in utfBytes)
        {
            Console.WriteLine("Hex: {0:X}", b);
        }
        string menu2 = utf8.GetString(utfBytes, 0, utfBytes.Length);
        Console.WriteLine(menu2);

您需要显式转换:

var utf8 = Encoding.UTF8.GetBytes("Menü");

utf8包含0x4d, 0x65, 0x6e, 0xc3, 0xbc