UTF-16编码中生成的0字节空值是否应当删除?
关于UTF-16编码中0值字节的问题
绝对不能删除这些0值!原因如下:
这些0不是无用数据,是UTF-16编码规范的必要组成部分。
Encoding.Unicode本质是小端模式的UTF-16,英文字符属于ASCII范围,其UTF-16编码的高字节就是0,但如果是中文、日文等非ASCII字符,高字节会是有效数值。一旦删除这些0,后续把字节数组转回字符串时会直接乱码——比如你把[72,0,105,0]改成[72,105],再用Encoding.Unicode.GetString()解码,得到的会是完全错误的字符。至于遍历速度的问题:几个0值对遍历性能的影响几乎可以忽略不计。如果真的想优化数组遍历效率,不如换用单字节编码方案:
- 若你的字符串只有ASCII字符,用
Encoding.ASCII.GetBytes("Hi")会得到[72,105],没有额外的0,数组长度直接减半; - 若需要兼容非ASCII字符,用
Encoding.UTF8.GetBytes("Hi")同样得到[72,105],UTF-8对ASCII字符用单字节存储,对多字节字符也能正确编码,通用性更强。
- 若你的字符串只有ASCII字符,用
内容的提问来源于stack exchange,提问作者electroroyaler
相关产品推荐
相关产品推荐

