UTF-8、GB2312、GBK编码格式详解和编码示例
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编码格式详解和编码示例的更多相关文章
- Base64编码格式详解
什么是Base64? 按照RFC2045的定义,Base64被定义为:Base64内容传送编码被设计用来把任意序列的8位字节描述为一种不易被人直接识别的形式.(The Base64 Content-T ...
- WebService核心文件【server-config.wsdd】详解及调用示例
WebService核心文件[server-config.wsdd]详解及调用示例 作者:Vashon 一.准备工作 导入需要的jar包: 二.配置web.xml 在web工程的web.xml中添加如 ...
- Linux lsof命令详解和使用示例【转】
所以如传输控制协议 (TCP) 和用户数据报协议 (UDP) 套接字等,系统在后台都为该应用程序分配了一个文件描述符,无论这个文件的本质如何,该文件描述符为应用程序与基础操作系统之间的交互提供了通用接 ...
- php为什么需要异步编程?php异步编程的详解(附示例)
本篇文章给大家带来的内容是关于php为什么需要异步编程?php异步编程的详解(附示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 我对 php 异步的知识还比较混乱,写这篇是为了 ...
- laravel 框架配置404等异常页面的方法详解(代码示例)
本篇文章给大家带来的内容是关于laravel 框架配置404等异常页面的方法详解(代码示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 在Laravel中所有的异常都由Handl ...
- 字符集、字符编码、国际化、本地化简要总结(UNICODE/UTF/ASCII/GB2312/GBK/GB18030)
PS:要转载请注明出处,本人版权所有. PS: 这个只是基于<我自己>的理解, 如果和你的原则及想法相冲突,请谅解,勿喷. 环境说明 普通的linux 和 普通的windows. ...
- 详解one-hot编码
博主原创文章,转载请注明出处 https://www.cnblogs.com/shuaishuaidefeizhu/p/11269257.html 一.什么是one-hot编码? One-Hot编码, ...
- 详解字符编码与 Unicode
人类交流使用 A.B.C.中 等字符,但计算机只认识 0 和 1.因此,就需要将人类的字符,转换成计算机认识的二进制编码.这个过程就是字符编码. ASCII 最简单.常用的字符编码就是 ASCII(A ...
- 详解Base64编码和解码
Base64是最常用的编码之一,比如开发中用于传递参数.现代浏览器中的<img />标签直接通过Base64字符串来渲染图片以及用于邮件中等等.Base64编码在RFC2045中定义,它被 ...
随机推荐
- JS时间和时间戳的转换
时间转为时间戳 timeToTimestamp(time){ let timestamp = Date.parse(time) return timestamp; } 时间戳转为本地时间 timest ...
- windows:shellcode生成框架和加载
https://www.cnblogs.com/theseventhson/p/13194646.html 分享了shellcode 的基本原理,核心思路是动态获取GetProcAddress和Lo ...
- MySQL的utf8问题
作者:brightwang 原文:https://www.jianshu.com/p/ab9aa8d4df7d 有时候用MySQL存储一些特殊字符时,有出现乱码问题. 我用的是UTF-8编码的客户端, ...
- Ef Core增加Sql方法
[AttributeUsage(AttributeTargets.Class|AttributeTargets.Method)] public class DbFunAttribute : Attri ...
- 银弹谷V百科|使用技巧:Vbase技巧二则之一
银弹谷零代码开发V平台提供访问窗体的短地址链接 格式:http://IP:port/form/componentCode/windowCode 例子: 默认地址:http://IP:port/mod ...
- vue中模块局部刷新
父组件: 一. 父组件中引入子组件 data中定义变量 二. 定义provide函数 三.写reload方法 需要刷新的那个子组件: 一.引入 ...
- MySQL8.0.20安装配置+用Navicat连接详细教程(win10,Navicat15)
MySQL 是最流行的关系型数据库管理系统,在 WEB 应用方面 MySQL 是最好的 RDBMS(Relational Database Management System:关系数据库管理系统)应用 ...
- Java流程控制,for,switch,while.break,continue,return
Java流程控制,for,switch,while.break,continue,return
- Eclipse开发Android项目报错解决方案详细教程,最新版一篇就够了!
本文记录刚接触Android开发搭建环境后新建工程各种可能的报错,并亲身经历漫长的解决过程(╥╯^╰╥),寻找各种偏方,避免大家采坑,希望能帮助到大家. 报错信息 出错一:The import and ...
- MySQL元数据信息
一.查看数据库清单 show databases; 二.查看数据库下表清单 方法1) show full tables from ${schema名}; 方法2) use ${数据库名}; show ...