C# 关于Encoding编码 举例UTF8

UTF-8编码中,一个字符可能由一个或多个字节组成。每个字节的前几位用于指示该字符需要多少字节来表示。具体来说,UTF-8编码使用以下规则:

如果一个字节的最高位是0,那么它表示一个ASCII字符,并且该字节就是该字符的完整表示。

如果一个字节以110开头,它表示这是一个两字节字符的第一个字节。

如果一个字节以1110开头,它表示这是一个三字节字符的第一个字节。

如果一个字节以11110开头,它表示这是一个四字节字符的第一个字节。

在你提供的byte[] bb数组中:

csharp 复制代码
byte[] bb = { 228, 189, 160, 229, 165, 189 };

228(二进制表示为11100100)是以1110开头的,所以它表示一个三字节字符 的第一个字节。
229(二进制表示为11100101)同样是以1110开头的,也表示一个三字节字符 的第一个字节。

在你的数组中,228229都是各自三字节UTF-8字符序列的开始。每个这样的序列都包含三个字节

其中第一个字节表示字符需要多少字节,而后面的字节包含字符的实际编码。

故要正确解码这些字节序列,你需要以三个字节为一组来解读它们。例如:

228, 189, 160 这三个字节一起表示一个UTF-8编码的字符。
229, 165, 189 这三个字节一起表示另一个UTF-8编码的字符。

当你使用Encoding.UTF8.GetString(bb)时,.NET FrameworkUTF-8解码器会识别这些字节序列,并将它们转换回对应的Unicode字符,然后这些字符会被组合成一个字符串。

在你的例子中,228, 189, 160 对应的Unicode字符是,而229, 165, 189 对应的Unicode字符是。所以,当你显示这个字符串时,你会看到"中文"。

简而言之,228229UTF-8编码中的作用是标识三字节字符序列的开始。它们自身并不直接对应任何字符,而是与跟随它们的字节一起,共同表示一个特定的Unicode字符。

注意:

csharp 复制代码
1byte = 8bit
相关推荐
牛哇网络工作室12 小时前
UnityHDRP写实数字人全流程基础5—语音输入和语音识别
android·unity·c#·游戏引擎·aigc·语音识别·xcode
zlinear数据采集卡1 天前
数据采集卡从入门到精通(9):分辨率与精度——16位卡不等于1/65536的精度
开发语言·数据库·fpga开发·开源·c#
深澈Vincel1 天前
我用 C# + WebView2 做了一个针对“流氓软件”的“一键清理工具“:架构实践与踩坑记录
c#
zlinear数据采集卡1 天前
数据采集卡从入门到精通(7):流水线型ADC——级级接力,高速与高精的平衡术
开发语言·arm开发·嵌入式硬件·fpga开发·c#
kingwebo'sZone1 天前
C# 根据公式计算的方法
开发语言·c#
阿部多瑞 ABU1 天前
告别手工核图:基于 .NET + MuPDFCore 的 CAD 等轴测 PDF 材料表提取与新旧版本对比实战
后端·算法·ui·pdf·c#
条形码D1 天前
DRG综合管理分析系统-目前已经支持CHS-DRG3.0
c#·drg·3.0分组器·drg分组器·chs-drg3.0分组器
Alex Gram2 天前
数据库同步工具PanguSync图文教程
java·mysql·postgresql·sqlserver·c#·数据库同步软件·数据库同步工具
头茬韭菜2 天前
第 10 篇:「Fluss 实战案例集」—— 完整解决方案与最佳实践
c#·linq·fluss
淡海水2 天前
01-05-运行时-JIT优化全景-内联去虚拟化边界检查消除
windows·c#·虚拟化·jit·内联·边界检查消除