1 字符集和字符编码的区别和联系

◼ 字符集:多个字符的集合。例如GB2312是中国国家标准的简体中文字符集,GB2312收录简化汉字(6763个)及一般符号、序号、数字、拉丁字母、日文假名、希腊字母、俄文字母、汉语拼音符号、汉语注音字母,共 7445 个图形字符。 ◼ 字符编码:把字符集中的字符编码为(映射)指定集合中的某一对象(例如:比特模式、自然数序列、电脉冲),以便文本在计算机中存储和通过通信网络的传递。

◼ 字符编码:把字符集中的字符编码为(映射)指定集合中的某一对象(例如:比特模式、自然数序列、电脉冲),以便文本在计算机中存储和通过通信网络的传递。

◼ 字符集和字符编码的关系 :

1. 字符集是书写系统字母与符号的集合

2. 而字符编码则是将字符映射为一特定的字节或字节序列,是一种规则。

通常特定的字符集采用特定的编码方式(即一种字符集对应一种字符编码(例如:ASCII、IOS-8859-1、GB2312、GBK,都是即表示了字符集又表示了对应的字符编码,但Unicode不是,它采用现代的模型))

2 字符集编码的发展

单字节 -> 双字节 -> 多字节

(1) 单字节

ASCII(American Standard Code for Information Interchange), 128个字符, 用7位二进制表示(00000000-01111111即0x00-0x7F); EASCII(Extended ASCII),256个字符,用8位二进制表示(00000000-11111111即0x00-0xFF)。 当计算机传到了欧洲,国际标准化组织在ASCII的基础上进行了扩展,形成了ISO-8859标准,跟EASCII类似,兼容ASCII,在高128个码位上有所区别。但是由于欧洲的语言环境十分复杂,所以根据各地区的语言又形成了很多子标准,ISO-8859-1、ISO-8859-2、ISO-8859-3、……、ISO-8859-16。

(2) 双字节

当计算机传到了亚洲,256个码位就不够用了。于是乎继续扩大二维表,单字节改双字节,16位二进制数,65536个码位。在不同国家和地区又出现了很多编码,大陆的GB2312、港台的BIG5、日本的Shift JIS等等。  注意65536个码位这种说法只是理想情况,由于双字节编码可以是变长的,也就是说同一个编码里面有些字符是单字节表示,有些字符是双字节表示。这样做的好处是,一方面可以兼容ASCII,另一方面可以节省存储容量,代价就是会损失一部分码位。

GBK(Chinese Internal Code Specification汉字内码扩展规范)是GB2312的扩展(gbk编码能够用来同时表示繁体字和简体字),按理说都属于双字节编码,码位是一样的,根本谈不上扩展,但实际上是预留空间在起作用。比如下图为GBK的编码空间,GBK/1、GBK/2是GB2312的区域,GBK/3、GBK/4、GBK/5是GBK的区域,红色是用户自定义区域,白色可能就是由于变长编码损失的区域了。

支持国际标准ISO/IEC10646-1和国家标准GB13000-1中的全部中日韩汉字。

GBK字符集中所有中文字符和全角符号占2个字节,字母和半角符号占一个字节。 没有特殊的编码方式,习惯称呼GBK 编码。一般在国内,汉字较多时使用。

当互联网席卷了全球,地域限制被打破了,不同国家和地区的计算机在交换数据的过程中,就会出现乱码的问题,即对同一组二进制数据,不同的编码会解析出不同的字符。

UNICODE 字符集国际标准字符集,它将世界各种语言的每个字符定义一个唯一的编码,以满足跨语言、跨平台的文本信息转换。 有多个编码方式,分别是 UTF-8,UTF-16,UTF-32 编码。

范例:“汉字”对应的 UNICODE 数字是 0x6c49 和 0x5b57,而编码的程序数据是:

  • UTF8 编码:    E6B189         E5AD97
  • UTF16BE 编码:6C49             5B57
  • UTF32BE 编码:00006C490     0005B57

(3) 多字节

Unicode 字符集 可以使用的编码有三种:

  • UFT-8:一种变长的编码方案,使用 1~6 个字节来存储;
  • UFT-32:一种固定长度的编码方案,不管字符编号大小,始终使用 4 个字节来存储;
  • UTF-16:介于 UTF-8 和 UTF-32 之间,使用 2 个或者 4 个字节来存储,长度既固定又可变

UTF 是 Unicode Transformation Format 的缩写,意思是“Unicode 转换格式”,后面的数字表明至少使用多少个比特位(Bit)来存储字符

3 Unicode 字符集

Unicode 只是字符集,utf-8、utf-16、utf-32 才是真正的编码方式。

Unicode 字符集 可以使用的编码有三种:

UFT-8:一种变长的编码方案,使用 1~6 个字节来存储;Abc 只有 3 个字节

UFT-32:一种固定长度的编码方案,不管字符编号大小,始终使用 4 个字节来存储;存储 abc  3*4=12 字节

UTF-16:介于 UTF-8 和 UTF-32 之间,使用 2 个或者 4 个字节来存储,长度既固定又可变。

UTF 是 Unicode Transformation Format 的缩写,意思是“Unicode 转换格式”,后面的数字表明至少使用多少个比特位(Bit)来存储字符

UTF-8

UTF-8: 是一种变长字符编码,被定义为将代码点编码为 1 至 4 个字节,具体取决于代码点数值中有效位的数量。

注意:UTF-8 不是编码规范,而是编码方式

下表为 Unicode 值对应的 utf8 需要的字节数量。

Utf8 前缀编码格式

unicode 编码(16 进制)

UTF-8 字节流(二进制)

000000 - 00007F

0xxxxxxx     ascii 码

000080 - 0007FF

110xxxxx 10xxxxxx

000800 - 00FFFF

1110xxxx 10xxxxxx 10xxxxxx

01 0000 - 10 FFFF

11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

范例:计算 Unicode 码使用 utf8 进行表示:

例如:汉字 的 Unicode 码是 4E25 转换成二进制就是 01001110 00100101 共 15 位,根据上表可知使用 UTF-8 字符编码后占 3 个字节,因此前 3 位是 1,第 4 位(n+1 位)

是 0,后面两个字节中每个字节的前两位都是 10,即 1110 xxxx 10 xxxxxx 10xxxxxx。填充进去后就变成了 1110 0100 10 111000 10 100101 共计 24 位占 3 个字节。

GBK 内码、Unicode 查询:http://www.mytju.com/classcode/tools/encode_gb2312.asp

UTF-16

UFT-16 比较奇葩,它使用 2 个或者 4 个字节来存储。

  1. 对于 Unicode 编号范围在 0~FFFF 之间的字符,UTF-16 使用两个字节存储,并且直接存储 Unicode 编号,不用进行编码转换,这跟 UTF-32 非常类似。
  2. 对于 Unicode 编号范围在 10000~10FFFF 之间的字符,UTF-16 使用四个字节存储,具体来说就是:将字符编号的所有比特位分成两部分,较高的一些比特位用一个值介于 D800~DBFF 之间的双字节存储,较低的一些比特位(剩下的比特位)用一个值介于 DC00~DFFF 之间的双字节存储。

Unicode 编号范围

(十六进制)

具体的 Unicode 编号

(二进制)

UTF-16 编码

字节

0000 0000~0000 FFFF

xxxxxxxx xxxxxxxx

xxxxxxxx xxxxxxxx

2

0001 0000~0010 FFFF

yyyy yyyy yyxx xxxx xxxx

110110yy yyyyyyyy 110111xx xxxxxxxx

4

UTF-32

UTF-32 是固定长度的编码,始终占用 4 个字节,足以容纳所有的 Unicode 字符,所以直接存储 Unicode 编号即可,不需要任何编码转换。浪费了空间,提高了效率。

UTF BOM 问题

BOM(Byte Order Mark)字节序(字节顺序的标识),其实就是用大端(BE)还是小端(LE)。 比如 UTF-16BE 和 UTF-16LE:

  • UTF-16BE,其后缀是 BE 即 big-endian,大端的意思。大端就是将高位的字节放在低地址表示。
  • UTF-16LE,其后缀是 LE 即 little-endian,小端的意思。小端就是将高位的字节放在高地址表示。
  • UTF-16,没有指定后缀,即不知道其是大小端,所以其开始的两个字节表示该字节数组是大端还是小端。即 FE FF 表示大端,FF FE 表示小端。
UTF编码  Byte Order Mark
UTF-8 EF BB BF
UTF-16LE FF FE
UTF-16BE  FE FF 
UTF-32LE FF FE 00 00
UTF-32BE  00 00 FE FF

注:UTF-8缺省不带BOM 

如“汉”字在文件中的存储(不包括头):

Unicode编码  UTF-16LE  UTF-16BE UTF32-LE  UTF32-BE 
0x006C49  49 6C  6C 49  49 6C 00 00  00 00 6C 49

小结

程序打开一个文件时怎么识别用的是UTF-8还是UTF-16?

是否有标志做标志,在文件的开头几个字节就是标志.

➢ EF BB BF 表示UTF-8

➢ FE FF 表示UTF-16BE

➢ FF FE 表示UTF-16LE

➢ 00 00 FE FF 表示UTF32-BE

➢ FF FE 00 00 表示UTF32-LE

注意:只有 UTF-8 兼容 ASCII,UTF-32 和 UTF-16 都不兼容 ASCII,因为它们没有单字节编码。

查看完整的Unicode字符集,以及各种编码方式:https://unicode-table.com/cn/ Unicode和UTF编码转换:https://www.qqxiuzi.cn/bianma/Unicode-UTF.php

UTF-8缺省不带BOM

UTF-8中有一字节的情况,这种情况,就没有两端的说法了。至于另外的二,三,四字节情况,以三字节为例,如果你一定要弄出端法,也不是说不可以,比如,小端法就是“小-中-大”,大端法就是“大-中-小”。但现实情况是UTF-8仅仅采用了一种端法,就是大端法。

4 字符集相关命令

不同格式编码格式分析

文本内容:廖庆富 darren 老师

Unicode 编码:00005ED6 00005E86 00005BCC 00000064 00000061 00000072

00000072 00000065 0000006E 00008001 00005E08

UTF8 编码:E5BB96 E5BA86 E5AF8C 64 61 72 72 65 6E E88081 E5B888

UTF16BE 编码:FEFF 5ED6 5E86 5BCC 0064 0061 0072 0072 0065 006E 8001 5E08

UTF16LE 编码:FFFE D65E 865E CC5B 6400 6100 7200 7200 6500 6E00 0180 085E UTF32BE 编码:0000FEFF 00005ED6 00005E86 00005 BCC00000064000000610000007200000072000000650000006E0000800100005E 08

UTF32LE 编码:FFFE0000D65E0000865E0000CC5B000064000000610000007200000072000000650000006E00000001800000085E0000

Unicode 和 UTF 编码转换https://www.qqxiuzi.cn/bianma/Unicode-UTF.php

file

命令:

file:查看文件的编码方式 (分析结果做一个参考) 范例:

file -i chatset.cpp

chatset.cpp: text/x-c++; charset=utf-8

file -i chatset-gbk2312.cpp

chatset-gbk2312.cpp: text/x-c++; charset=iso-8859-1

iconv

iconv 命令是用来转换文件的编码方式的,比如它可以将 UTF8 编码的转换成 GB18030 的编码,反过来也行。Linux 下的 iconv 开发库包括 iconv_open,iconv_close,iconv 等 C 函数,可以用来在 C/C++程序中很方便的转换字符编码

语法: iconv -f encoding [-t encoding] [inputfile]...

-f encoding :把字符从 encoding 编码开始转换。

-t encoding :把字符转换到 encoding 编码。

-l :列出已知的编码字符集合

-o file :指定输出文件

-c :忽略输出的非法字符

-s :禁止警告信息,但不是错误信息

--verbose :显示进度信息

-f 和-t 所能指定的合法字符在-l 选项的命令里面都列出来了。

查看支持的格式 iconv -l, 这里节选部分格式

UTF-8, UTF-16, UTF-16BE, UTF-16LE, UTF-32, UTF-32BE,  UTF-32LE,

UTF8,  UTF16,   UTF16BE,   UTF16LE,   UTF32,   UTF32BE,   UTF32LE   GB2312  GBK ISO-8859-1

转换各种格式

iconv -f UTF-8  -t UTF-8  utf8.txt -o UTF-8.txt iconv -f UTF-8  -t UTF8   utf8.txt -o UTF8.txt

iconv -f UTF-8  -t UTF-16    UTF-8.txt -o UTF-16.txt iconv -f UTF-8  -t UTF-16BE  UTF-8.txt -o UTF-16BE.txt iconv -f UTF-8  -t UTF-16LE  UTF-8.txt -o UTF-16LE.txt

iconv -f UTF-8  -t UTF16     UTF-8.txt -o UTF16.txt iconv -f UTF-8  -t UTF16BE  UTF-8.txt -o UTF16BE.txt iconv -f UTF-8  -t UTF16LE         UTF-8.txt -o UTF16LE.txt

iconv -f UTF-8  -t UTF-32    UTF-8.txt -o UTF-32.txt iconv -f UTF-8  -t UTF-32BE  UTF-8.txt -o UTF-32BE.txt iconv -f UTF-8  -t UTF-32LE  UTF-8.txt -o UTF-32LE.txt

iconv -f UTF-8  -t GB2312    UTF-8.txt -o GB2312.txt iconv -f UTF-8  -t GBK        UTF-8.txt -o GBK.txt iconv -f UTF-8  -t ISO-8859-1 UTF-8.txt -o ISO-8859-1.txt

5 字符集转换编程

文档地址:http://www.gnu.org/software/libiconv/documentation/libiconv-1.13/

6 字符集应用案例

mysql 字符集设置

部分汉字在 mysql 使用 utf8 字符时写入出现异常,或者读取出现异常。 比如

字符编码Unicode原理相关推荐

  1. Java字符编码根本原理

    2019独角兽企业重金招聘Python工程师标准>>> Java开发中,常常会遇到乱码的问题,一旦遇到这种问题,常常就很扯蛋,每个人都不愿意承认是自己的代码有问题.其实编码问题并没有 ...

  2. 字符编码 unicode 及其在javascript 中的使用

    一.javascript 使用 unicode16 字符集,可以使用中文变量名和函数名 计算机使用 8 位(bit)二进制表示一个字节(Byte),计算机内存最小寻址单位就是 1 字节. 早期为了在计 ...

  3. java字符集与字符编码 Unicode字符集

    字符集与字符编码是两个不同的概念. 字符集,顾名思义就是字符的集合,比如ASCII字符集包含了a-z A-Z 0-9 半角标点符号和特殊控制符号在内的128个符号.对于一个字符集来说,要正确编码转码一 ...

  4. Python笔记:字符编码unicode/utf-8

    版权声明 请尊重原创作品.转载请保持文章完整性,并以超链接形式注明原始作者"tingsking18"和主站点地址,方便其他朋友提问和指正. Unicode和Python的中文处理 ...

  5. python3 gb2312转utf8_python2和python3字符编码 unicode,utf-8,gb2312相互转换encode,decode...

    一.预习: 1.Unicode 和utf-8之间的关系 unicode是一种编码标准,具体的实现标准可能是utf-8,utf-16,gbk -- UTF-8是Unicode的实现方式之一 2.pyth ...

  6. 字符集(字符编码)原理

    "位"(bit)是计算机能够处理的最小单位,计算机领域一般说的"位"都是指二进制的"位",我们实际生活中的"位"一般都是 ...

  7. 字符编码-Unicode等

    oschina上的国栋写过两个系列的文章. 字符集与编码 乱码探源 转载于:https://www.cnblogs.com/Searchor/p/5566940.html

  8. 【转】python 字符编码与解码——unicode、str和中文:UnicodeDecodeError: 'ascii' codec can't decode...

    原文网址:http://blog.csdn.net/trochiluses/article/details/16825269 摘要:在进行python脚本的编写时,如果我们用python来处理网页数据 ...

  9. 深入理解-字符编码ASCII,GB2312,GBK,Unicode,UTF-8

    字符编码 简介 起初再考虑写不写这篇文章,感觉这篇文章比较枯燥乏味,而且自己感觉也没理解的太透彻,就把理解的记录下来,所以这是纪念版的 前方高能,非战斗人员请迅速撤离,我要开始装逼了. Go hard ...

  10. 精述字符编码(读这篇就够了)

    文章目录 1.导语 2.ASCII 3.Latin1 4.ANSI 5.GB2312,GB13000,GBK,GB18030,BIG5 6.Unicode 与 BMP 7.UCS.UCS-2 与 UC ...

最新文章

  1. pde中微元分析法的主要思想_果然是清北学霸,高中数学解题思想与技巧方法,学会不下145分...
  2. java 之 多线程
  3. more 目录linux,linux(二)目录结构、文件基本操作cat\more\less、环境变量、文件搜索...
  4. 速卖通运营之商品结构及分层逻辑
  5. 常用ms-dos命令
  6. 0002-Add Two Numbers(两数相加)
  7. java 获取日期的几天前,几个月前和几年前
  8. 怎么用php myadmin连接远程MYSQL数据库
  9. 线程的sleep()方法和yield()方法有什么区别?
  10. Elite Model的NetSuite ERP国内成功实例!
  11. 人脸识别技术大起底,你了解多少?
  12. Flash Builder 4 正式版破解注册方法(flex4)
  13. MongoDB studio3T 破解
  14. php 正则 tr,js正则匹配table tr
  15. 【jQuery进阶】子菜单插件Slight Submenu
  16. 电商网站后台九大功能模块详解
  17. 成长的路上总会有那么一群人
  18. cocos2d-x 添加启动数字输入法的功能
  19. 第四次面试----华数电力科技有限公司
  20. 7种将字符串反转的 Java 方法

热门文章

  1. go技术文章梳理(2017)
  2. 推荐2021年最受欢迎的15款Vue后台管理模板
  3. 计算机编码--3.GB2312与GBK
  4. 上传doc,pdf,ppt,png,jpg,html文件并解析内容
  5. 使用IDEA进行Lua代码调试、自动提示、代码跳转、智能重命名
  6. 正则摄动法matlab,孤立特征值情况的矩阵摄动法
  7. 微信小程序——定位(根据经纬度算距离)
  8. Caused by: java.io.IOException: ZIP entry size is too large
  9. 单片机(嵌入式)程序分层架构
  10. 南开100题c语言计算机二级,3月计算机二级C语言题库南开100题.pdf