如何获得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验证
我尝试了很多转换方法,但我不能得到预期的结果。
更新:有趣,问题不在源代码中,而是在输入文件中的错误编码:-)这些答案帮助了我很多。
没有"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