1.字符集与编码
字符集:表示多个字符的集合 , 如符号 , 序号、数字 , 其它等等 。
字符编码:把字符编码为指定集合中的某一对象 , 变成一种特定的字节或字节序列 , 在计算机中便于存储 , 传输 。
通常字符集都采用对应的编码方式 , 如ASCII、IOS-8859-1、GB2312、GBK , 即表示了字符集又表示了对应的字符编码 , 但是Unicode例外 , 它采用的现代模型 。
文章插图
2.字符集编码的发展
字符集编码的发展 , 从单字节 , 发展到双字节 , 最终到多字节 。
(1)单字节
ASCII , 用 7 位二进制表示(00000000-01111111 即 0x00-0x7F) 。EASCII(Extended ASCII),256 个字符 , 用 8 位二进制表示(00000000-11111111 即 0x00-0xFF) 。
(2)双字节
当计算机传到了亚洲 , 256 个码位就不够用了 。于是乎继续扩大二维表 , 单字节改双字节 , 16 位二进制数 , 65536 个码位 。在不同国家和地区又出现了很多编码 , 大陆的 GB2312、港台的 BIG5、日本的 Shift JIS 等等 。
双字节编码是可以变长 , 主要是为了兼容ASCII码和节省存储容量 , 但是可能会损失一部分码位 。
UNICODE 字符集国际标准字符集 , 它将世界各种语言的每个字符定义一个唯一的编码 , 以满足跨语言、跨平台的文本信息转换 。有多个编码方式 , 分别是 UTF-8 , UTF-16 , UTF-32 编码 。
(3)多字节
UTF表示Unicode Transformation Format的缩写 , 是一种Unicode转换格式 , 后面的数字表示至少用多少个比特位来存储字符 。
UTF-8表示一种变长编码方案 , 使用1-6个字节来存储;
UTF-16使用2个或4个字节来存储 , 长度固定又可变 。
UTF-32表示一种固定长度编码方案 , 使用4个字节来存储 。
Utf8前缀编码格式如下:
文章插图
当Unicode 编号范围在 0~FFFF 之间的字符 , UTF-16 使用两个字节存储 , 并且直接存储 Unicode 编号 , 不用进行编码转换 , 这跟 UTF-32 非常类似 。当Unicode 编号范围在 10000~10FFFF 之间的字符 , UTF-16 使用四个字节存储 。实际就把较高的一些比特位用D800~DBFF 之间的双字节存储 , 较低的比特位用DC00~DFFF之间的双字节存储 。
文章插图
UTF-32 是固定长度的编码 , 始终占用 4 个字节 , 足以容纳所有的 Unicode 字符 , 所以直接存储 Unicode 编号即可 , 不需要任何编码转换 。浪费了空间 , 提高了效率 。
UTF大小端问题
BOM实际就是使用大端(BE)还是小端(LE)问题 。
UTF-16BE , 大端:就是把高位字节放在低地址表示 。
UTF-16LE , 小端:就是把低字节放在低地址表示 。
UTF在文件的存储 。UTF格式在文件中总有固定文件头 。UTF-8缺省不带BOM 。
当打开一个文件时 , 怎么识别使用的是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 , 因为这连个没有单字节编码 。
iconv
iconv命令用来转换文件的编码 , 如将UTF8编码转换成GB18030的编码 , linux下的iconv开发库包括iconv_open,iconv_close,iconv等C函数 , 实现快速转换 。
格式:
iconv -f encoding [-t encoding] [inputfile] ....
选项:
-f encoding :字符从encoding编码开始转换
-t encoding :字符转换到encoding编码
-l:已知的编码字符集合
-o file :指定输出文件
-c :忽略输出的非法字符
-s :禁止警告信息 , 但不是错误信息
--verbose :显示进度信息
查看支持的格式: 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 。
转换各种格式:
推荐阅读
- 深入聊聊Linux 五种IO模型
- 第08期:有关 MySQL 字符集的注意事项
- 聊聊小程序运行机制的那些事
- 2种防御性编码技术
- 理解Python的编码问题
- 聊聊Spring boot2.X开发环境搭建和基本开发
- 淘宝卖家商品编码应该如何写呢 库存商品编码是多少
- 聊聊Java中的异常及处理
- 聊聊服务灾备
- 多线程场景下编码的一些思考