在将多个(UTF-8)字节数组转换为字符串的时候,可能会发生乱码,这不是因为编码问题。

UTF-8是一种变长字节编码方式。对于某一个字符的UTF-8编码,如果只有一个字节则其最高二进制位为0;如果是多字节,其第一个字节从最高位开始,连续的二进制位值为1的个数决定了其编码的位数,其余各字节均以10开头。UTF-8最多可用到6个字节。

所以,如果一个字符编码成3个字节,但是一个字节数组的结尾可能只包含了其中两个字节,而后一个字节数组开头包含了该字符编码的最后一个字节,那么,如果两个字节数组单独解码,就会发生乱码。

要解决这个问题,要了解UTF-8的编码规则,如下所示:

1字节0xxxxxxx 
2字节110xxxxx 10xxxxxx 
3字节1110xxxx 10xxxxxx 10xxxxxx 
4字节11110xxx 10xxxxxx 10xxxxxx 10xxxxxx 
5字节111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 
6字节1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx

知道了编码规则,就知道如何处理这种情况了

当要对一个字节数组进行解码时,要对这个字节数组最后几个字节进行判断,如果是一个完整的字符,则可以进行解码

否则,要将不完整的字节截取出来,拼接到下一字节数组后进行解码。

关于UTF-8占几个字节的问题

占2个字节的:〇

占3个字节的:基本等同于GBK,含21000多个汉字

占4个字节的:中日韩超大字符集里面的汉字,有5万多个

一个utf8数字占1个字节

一个utf8英文字母占1个字节

在查找 UTF-8 编码资料时发现,很多的帖子说的 UTF-8 编码里,一个汉字占用3个字节,有的还做了个证明,大概是这样的,创建一个没有BOM的UTF-8编码的文本文件,里面保存了几个汉字,然后查看文件的大小。我觉得这样的证明没有一点说服力,因为 UTF-8 是变长的,1-6个字节,少量的汉字检测是不能说明所有的汉字都是的。

后来我又查看了字符映射表-汉语,找到了正确的答案,少数是汉字每个占用3个字节,多数占用4个字节。

占用3个字节的范围

[text] view plaincopy
  1. U+2E80 - U+2EF3 : 0xE2 0xBA 0x80 - 0xE2 0xBB 0xB3      共 115 个
  2. U+2F00 - U+2FD5 : 0xE2 0xBC 0x80 - 0xE2 0xBF 0x95      共 213 个
  3. U+3005 - U+3029 : 0xE3 0x80 0x85 - 0xE3 0x80 0xA9      共 36 个
  4. U+3038 - U+4DB5 : 0xE3 0x80 0xB8 - 0xE4 0xB6 0xB5      共 7549 个
  5. U+4E00 - U+FA6A : 0xE4 0xB8 0x80 - 0xEF 0xA9 0xAA      共 44138 个
  6. U+FA70 - U+FAD9 : 0xEF 0xA9 0xB0 - 0xEF 0xAB 0x99      共 105 个

合计: 52156 个

占用4个字节的范围

[text] view plaincopy
  1. U+20000 - U+2FA1D : 0xF0 0xA0 0x80 0x80 - 0xF0 0xAF 0xA8 0x9D      共 64029 个

合计: 64029 个

如果想了解一下编码史,可以看一下这篇博客:http://blog.csdn.net/baixiaoshi/article/details/40786503

后续会贴出转换的测试代码:

UTF-8编码规则解析相关推荐

  1. 三菱空调红外码值编码规则解析

    三菱空调红外码值编码规则解析 一.空调红外控制原理 空调遥控器是通过发射断断续续的红外光来传递信息的,我们可以把发射的时候看做是"1",没发射的时候看做是"0" ...

  2. 成本计算引擎动态规则解析技术详解

    源宝导读:随着企业数字系统应用的越来越深入,业务计算方式也变的越来越复杂,灵活度要求也越来越高.本文将介绍通过将配置动态转换成可执行代码的方式,解决业务计算高度灵活化配置的技术方案. 一.背景 ERP ...

  3. xss编码绕过详解(更像是在介绍实体编码和JS编码的解析过程)

    xss编码绕过详解(更像是在介绍实体编码和JS编码的解析过程) 注:本文通过研究各种情况下实体编码和JS编码是否生效,进而总结了哪些情况下能够进行编码后,javascript代码依然能够正常执行. 解 ...

  4. ASCII、Unicode、UCS-2、UTF-8 等字符编码规则的区别与联系

    目录 一.前言 二.补充(bit & Byte) 三.ASCII(美国信息交换标准代码) 四.各国独立的语言编码 五.Unicode(统一码.万国码) 1. Unicode字符集 2. Uni ...

  5. 二代身份证编码规则及校验代码实现

    本文主要讨论的是二代身份证编码规则及其Java代码实现,下面的校验方式还不是特别严谨,由于只校验了前两位的省份信息,中间六位的出生日期信息和最后一位的校验码信息,故对于部分不满足要求的证件号码刚好同时 ...

  6. C语言密勒码的软件编码,密勒码的编码规则是什么?请画出代码序列11010010的密勒码波形?...

    相关题目与解析 CMI码的编码规则是什么?请画出代码序列11010010的CMI码波形? 数字双相码的编码规则是什么?请画出代码序列11010010的双相码波形? 简述双相码(曼彻斯特码)的编码规则并 ...

  7. SNMP协议中OID的编码规则

    前言 SNMP协议基于UDP,代理软件(服务器)监听161端口,管理端(客户端)监听162端口. 正常请求:管理端发送请求到161端口,代理软件收到请求后将数据返回给管理端源端口. 主动上报:代理软件 ...

  8. 以太坊RLP编码规则

    链客,专为开发者而生,有问必答! 此文章来自区块链技术社区,未经允许拒绝转载. 区块链中以太坊RLP编码规则! RLP(Recursive Length Prefix,递归长度前缀)编码算法,是以太坊 ...

  9. 宜信开源|数据库审核软件Themis的规则解析与部署攻略

    一.介绍 Themis是宜信公司DBA团队开发的一款数据库审核产品,可帮助DBA.开发人员快速发现数据库质量问题,提升工作效率.其名称源自希腊神话中的正义与法律女神.项目取此名称,寓意此平台对数据库质 ...

最新文章

  1. 【撸码师的读书笔记】 深入理解Java虚拟机——JVM高级特性与最佳实践
  2. rtx3090 pytorch_RTX 3090显卡8K游戏测试演示 《暗黑3》稳定60帧运行
  3. Linux下进行谷歌浏览器安装
  4. 强化学习(一)---绪论
  5. MAT之GA:利用GA对一元函数进行优化过程,求x∈(0,10)中y的最大值
  6. 【PP模块】订单分割(Order Split)
  7. Django 3.2.5博客开发教程:URL与视图函数
  8. 重新想象 Windows 8 Store Apps (52) - 绑定: 与 Element Model Indexer Style RelativeSource 绑定, 以及绑定中的数据转换...
  9. 区块链在供应链领域的应用
  10. 帆软报表(finereport)点击事件对话框打开
  11. 第八节:数据库层次的锁机制详解和事务隔离级别
  12. 解压android img文件怎么打开,解压压缩android img文件
  13. c 获取mysql安装路径_linux查看mysql安装路径
  14. linux驱动基础开发3——linux 内核配置机制(make menuconfig、Kconfig、makefile)讲解-转
  15. 物联网形势大好,传感器前景可观
  16. Python之路--Django--auth认证系统
  17. ACM 学习笔记(六) 图论
  18. 5寸照片尺寸_证件照尺寸及更换背景颜色教程
  19. 有哪些简洁的人生建议?
  20. 美团2020后台校招题目--美团骑手包裹区间分组

热门文章

  1. 上海电子政务,亡羊补牢是否为时未晚?
  2. 快速了解 Uniswap-v2
  3. 涂鸦WIFI模组方案(MCU SDK)
  4. 做事要靠自己-----让你变得更坚强
  5. 4U 智能航行器的含义
  6. ASP .NET Core MVC 过滤器之一 ActionFilterAttribute
  7. B端系统体验好不好,尼尔森十大可用性原则
  8. 【白板动画制作软件】万彩手影大师教程 | 调整整个动画时长
  9. uml 菱形_uml类图符号介绍 | 学步园
  10. 二进制正负数转换和移位的规则详解