encoding.utf8.getstring怎么得出正确字符的

utf8编码不是固定字节,有的是1个字节有的是2个字节有的是3个,那么


encoding.utf8.getstring是怎么把一堆字节解析成正确的字符,比如说有6个字节,为什么不会判断成6个单字节或者1+2+3,或者3+3或者2+2+2呢?

其实是utf8编码

0xxxxxxx                                                                                  (00-7f)
110xxxxx 10xxxxxx                                                                  (c0-df)(80-bf)
1110xxxx 10xxxxxx 10xxxxxx                                                  (e0-ef)(80-bf)(80-bf)
11110xxx 10xxxxxx 10xxxxxx 10xxxxxx                                  (f0-f7)(80-bf)(80-bf)(80-bf)
111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx                  (f8-fb)(80-bf)(80-bf)(80-bf)(80-bf)
1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx  (fc-fd)(80-bf)(80-bf)(80-bf)(80-bf)(80-bf)

如果第一个字节二进制是110就说明2个字节,1110就说明3个字节类推,而且其他字节二进制开头都用10来表示,而如果是0-127那么就是单字节,这样的格式就可以不会混淆了


比如6个字节

11001111   10000000   11100101   10010101   10001010   01000001  

110说明2字节 11001111   10000000是一个字符,第二个也是10开头

接下来1110说明是3个11100101   10010101   10001010,后两个也是10开头

最后0开头说明就1个

那么这个字节数组转字符串也就是“π啊A”


如果破坏了这个规则,c#会按照顺序,不会后面全变乱码,比如把第一个改成11101111,把第三个改成01100001

11101111   10000000   01100001   10010101   10001010   01000001  

那么上来第一个1110看起来3个,第二个10开头对了,但第3个就不符合10开头了,所以把第一第二个先来乱码一个?

那么从第三个开始,发现0开头单字节对了,于是显示a

接下来第四个上来10开头也不对,乱码一个?

第五个也是上来10开头,乱码一个?

直到第六个0开头,单字节,就对了,显示A

这样结果就是"?a??A"

这样的好处就是不会因为一大篇文章中坏了一点就导致整篇文章全都乱码。


### Unity WebGL 中 `Encoding.UTF8.GetString()` 的使用方法与最佳实践 在 Unity WebGL 项目中,`Encoding.UTF8.GetString()` 是用于将字节数组转换为字符串的方法之一。此方法广泛应用于处理网络通信、文件读取或其他涉及二进制数据到可读文本的场景。 以下是关于该方法的具体说明以及其使用的最佳实践: #### 方法概述 `Encoding.UTF8.GetString(byteArray)` 将指定的字节序列解码为 UTF-8 编码的字符串[^1]。它适用于任何需要解析 UTF-8 字符串的情况,在 Unity WebGL 平台下尤其需要注意性能和兼容性问题。 #### 使用示例 下面是一个简单的代码示例展示如何在 Unity WebGL 环境中正确使用 `Encoding.UTF8.GetString()`: ```csharp using System.Text; using UnityEngine; public class Utf8Example : MonoBehaviour { void Start() { byte[] byteArray = { 72, 101, 108, 108, 111 }; // 对应 "Hello" string resultString = Encoding.UTF8.GetString(byteArray); Debug.Log(resultString); // 输出: Hello // 如果有部分特殊字符或乱码情况可以尝试如下方式验证编码准确性 try { string safeResult = ValidateUtf8AndConvert(byteArray); Debug.Log(safeResult); } catch (System.ArgumentException e) { Debug.LogError("Invalid UTF-8 sequence detected."); } } /// <summary> /// 验证并安全地将字节数组转为UTF-8字符串 /// </summary> private static string ValidateUtf8AndConvert(byte[] data) { if (!IsUtf8(data)) { throw new System.ArgumentException("The provided bytes are not valid UTF-8"); } return Encoding.UTF8.GetString(data); } /// <summary> /// 判断给定字节数组是否为有效的UTF-8编码 /// </summary> public static bool IsUtf8(byte[] data) { int charByteCounter = 0; // 记录当前多字节字符还剩多少字节未处理 foreach (byte b in data) { if ((b & 0x80) == 0) // ASCII范围内的单字节字符 continue; if (charByteCounter == 0 && (b >> 5) == 0x6) // 多字节起始标志位 charByteCounter = 1; else if (charByteCounter != 0 && (b >> 6) == 0x2) // 后续字节校验 --charByteCounter; else return false; // 不合法的UTF-8序列 } return charByteCounter == 0; } } ``` 上述代码展示了基本的 `Encoding.UTF8.GetString()` 调用,并提供了一个额外的安全检查函数来确保输入的数据确实是有效的 UTF-8 序列。 #### 最佳实践 为了提高程序健壮性和效率,请遵循以下建议: 1. **始终验证输入的有效性**: 在实际应用中,尤其是接收来自外部源(如网络请求)的数据时,务必先确认这些数据确实符合 UTF-8 格式。 2. **避免不必要的内存分配**: 当频繁操作大量数据时,考虑重用缓冲区以减少垃圾回收压力。 3. **注意跨平台差异**: Unity WebGL 可能存在与其他桌面环境不同的行为表现,因此需针对目标平台进行充分测试。 #### 性能考量 WebGL 版本下的 Unity 运行于浏览器环境中,可能受到 JavaScript VM 实现的影响而表现出不同于原生 C# 的特性。对于大规模数据集的操作,应当评估不同实现方案之间的性能差距,并选取最优策略。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值