UTF-8、GB2312、GBK编码格式详解

参考文章

UTF-8

使用1~4个字节对每个字符进行编码

  • 128个ASCII字符字需要一个字节编码
  • 带有附加符号的拉丁文、希腊文、西里尔字母、亚美尼亚语、希伯来文、阿拉伯文、叙利亚文及它拿字母则需要两个字节进行编码
  • 其他基本多文种平面中的字符(这包含了大部分常用字,如大部分的汉字)使用三个字节编码
  • 其他极少使用的Unicode辅助平面的字符使用四至六字节编码

GB2312,GBK编码

  • GB2312:一个小于127的字符意义与原来的相同,但是两个大于127的字符连在一起时,就表示一个汉字;前面的一个字节(高字节)从0xA1用到0xF7,后面一个字节(低字节)从0xA1到0xFE;其中,在ASCII里本来就有个的数字、标点、字母都统统重新编了两个字节长的编码,这就是常说的“全角”字符,而原来在127号以下的那些就叫“半角”字符
  • GBK:不再要求低字节一定是127号之后的编码,只要第一个字节是大于127就固定表示这是一个汉字的开始,不管后面跟的是不是扩展字符集里的内容

例子

以下例子使用nodeJS来编写,具体代码和相关测试文件可见Github。

联通

参考文章中给出了一个比较经典的例子,在这里详细研究一下。

------------------非UTF-8编码保存的[联通]数据------------------

<Buffer c1 aa cd a8>

------------------UTF-8编码保存的[联通]数据-带BOM------------------

<Buffer ef bb bf e8 81 94 e9 80 9a>

------------------UTF-8编码保存的[联通]数据-不带BOM------------------

<Buffer e8 81 94 e9 80 9a>
  • 可以清楚看到window默认编码格式GB2312和UTF-8编码格式的区别:GB2312使用两个字节对汉字进行编码,而UTF-8使用三个字节对汉字进行编码
  • UTF-8带BOM的编码格式和不带BOM的编码格式之间的区别:BOM格式会在头部添加ef bb bf三个字节作为标志

中英文混合

这个主要是看各个编码格式对于ASCII编码的兼容情况

------------------非UTF-8编码保存的[hello 你好]数据------------------
<Buffer 68 65 6c 6c 6f 20 c4 e3 ba c3>
------------------UTF-8编码保存的[hello 你好]数据-带BOM------------------
<Buffer ef bb bf 68 65 6c 6c 6f 20 e4 bd a0 e5 a5 bd>
------------------UTF-8编码保存的[hello 你好]数据-不带BOM------------------
<Buffer 68 65 6c 6c 6f 20 e4 bd a0 e5 a5 bd>
  • 可以看出,两种编码格式对ASCII都能兼容,前面的[hello ]两者的编码是一致的,而中文字符编码则是根据各自不同的编码规则来得
  • 如果只有ASCII字符,则两种编码是等价的,GB2312方式打开UTF-8编码的文件不会出现乱码,反之亦然

编码格式区分

  • 带有BOM信息的,可以根据BOM信息进行区分:前三个字节为:ef bb bf的是UTF-8编码格式
  • 没有BOM信息的,则需要按字节进行区分:如果UTF-8中有中文字符,则可以根据1110XXXX 10XXXXXX 10XXXXXX这种格式来进行区分;如果UTF-8中有其他两个字节编码的字符则较难进行区分,希望有人可以给指点

UTF-8、GB2312、GBK编码格式详解和编码示例的更多相关文章

  1. Base64编码格式详解

    什么是Base64? 按照RFC2045的定义,Base64被定义为:Base64内容传送编码被设计用来把任意序列的8位字节描述为一种不易被人直接识别的形式.(The Base64 Content-T ...

  2. WebService核心文件【server-config.wsdd】详解及调用示例

    WebService核心文件[server-config.wsdd]详解及调用示例 作者:Vashon 一.准备工作 导入需要的jar包: 二.配置web.xml 在web工程的web.xml中添加如 ...

  3. Linux lsof命令详解和使用示例【转】

    所以如传输控制协议 (TCP) 和用户数据报协议 (UDP) 套接字等,系统在后台都为该应用程序分配了一个文件描述符,无论这个文件的本质如何,该文件描述符为应用程序与基础操作系统之间的交互提供了通用接 ...

  4. php为什么需要异步编程?php异步编程的详解(附示例)

    本篇文章给大家带来的内容是关于php为什么需要异步编程?php异步编程的详解(附示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 我对 php 异步的知识还比较混乱,写这篇是为了 ...

  5. laravel 框架配置404等异常页面的方法详解(代码示例)

    本篇文章给大家带来的内容是关于laravel 框架配置404等异常页面的方法详解(代码示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 在Laravel中所有的异常都由Handl ...

  6. 字符集、字符编码、国际化、本地化简要总结(UNICODE/UTF/ASCII/GB2312/GBK/GB18030)

    PS:要转载请注明出处,本人版权所有. PS: 这个只是基于<我自己>的理解, 如果和你的原则及想法相冲突,请谅解,勿喷. 环境说明   普通的linux 和 普通的windows.    ...

  7. 详解one-hot编码

    博主原创文章,转载请注明出处 https://www.cnblogs.com/shuaishuaidefeizhu/p/11269257.html 一.什么是one-hot编码? One-Hot编码, ...

  8. 详解字符编码与 Unicode

    人类交流使用 A.B.C.中 等字符,但计算机只认识 0 和 1.因此,就需要将人类的字符,转换成计算机认识的二进制编码.这个过程就是字符编码. ASCII 最简单.常用的字符编码就是 ASCII(A ...

  9. 详解Base64编码和解码

    Base64是最常用的编码之一,比如开发中用于传递参数.现代浏览器中的<img />标签直接通过Base64字符串来渲染图片以及用于邮件中等等.Base64编码在RFC2045中定义,它被 ...

随机推荐

  1. PHP constant() 函数

    实例 返回一个常量的值: <?php//define a constantdefine("GREETING","Hello you! How are you tod ...

  2. 删除数据-大表根据rowid来删除部分数据

    偶遇需求,大表中需要删除部分数据.分批删除. declare TYPE type_table_rowid IS TABLE OF ROWID INDEX BY BINARY_INTEGER;table ...

  3. 埋在MySQL数据库应用中的17个关键问题!

    作者:扎瓦陈序元 来源:https://blog.csdn.net/weixin_42882439 MySQL的使用非常普遍,跟MySQL有关的话题也非常多,如性能优化.高可用性.强一致性.安全.备份 ...

  4. 什么是DO,DTO,VO,POJO

    俗话说,没有规矩不成方圆,今天来说一下 Java 中的各种 O(bject). 为什么会出现这些 O? 我们知道,这些 O 不管叫什么名字,其本质都还是对象(Object),既然本质都一样,为什么非要 ...

  5. e分钟带你利用Python制作词云图

    随着大数据时代的来临,数据分析与可视化,显得越来越重要,今天给小伙伴们带来一种最常见的数据可视化图形-词云图的制作方法. 很多人学习python,不知道从何学起.很多人学习python,掌握了基本语法 ...

  6. Python笔试——毕业旅行问题

    毕业旅行问题 小明目前在做一份毕业旅行的规划.打算从北京出发,分别去若干个城市,然后再回到北京,每个城市之间均乘坐高铁,且每个城市只去一次.由于经费有限,希望能够通过合理的路线安排尽可能的省一些路上的 ...

  7. css实现折扇效果

    总结思路: 1.首先进行结构的书写   <div class="box"></div> 2.要进行图片的重叠要用到position定位,需要重叠的元素及子元 ...

  8. Vue watch 深层监听

    Vue中监听某个对象的属性 为了避免监听整个对象导致效率问题,可以监听某个对象的特定属性 watch: { 'deptModel.depts': { handler(newVal, oldVal) { ...

  9. CPF 入门教程(一)

    CPF netcore跨平台UI框架 开发之前,你需要先安装VS2019.为什么要vs2019?因为VS2019才能支持netcore3.0以上,netcore3.0之后才能发布独立的程序,之前的都只 ...

  10. 图论算法(一)存图与STL第六弹——vector容器

    图论算法(一)存图 我发现我的博客阅读量贼低,问小伙伴们,ta们都说这些博客太长了QAQ! 今天来个短亿点的(也短不了多少……) 进入正题,图论究竟是什么? 图论就是给你一张图,让你在这张图上进行各种 ...