unicode字符集和utf-8编码

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

  1. 字符集 是  书写系统字母与符号的集合
  2. 字符编码则是 将字符映射为一 特定的字节 或字节序列, 是一种规则。
  3. 通常特定的字符集 采用特定的编码方式(即一种字符集 对应一种字符编码,例如ASCII, IOS-8859-1, GB2312, GBK ,都是表示了字符集又表示了相应的字符编码,)但 unicode 不是,他的编码方式 有好几种 如 :UTF-8  UTF-16BE  UTF-16LE UTF-32 等

字符集的发展

单字节  ->   双字节 —> 多字节。

(1)单字节

ASCII  (American Standard Code for Information Interchange)  , 128 个字符, 即 0x00 - 0x7F

EASCII ( Extended ASCII), 256个字符,0x00 - 0xFF 。

(2) 双字节

大陆的 GB2312, 港台 BIG5, 日本的 Shift JIS

注意 65536个码位 这种说法只是理想的情况  ,由于双字节 编码 可以是变长的, 也就是 同一个编码里面有些字符是单字节表示, 有些字符是双字节表示。

这样做的好处是,一方面可以兼容 ASCII, 另一方面 可以节省 存储容量,代价就是 会损失一部分码位。

GBK(Chinese Internal Code Specification  汉字内码扩展规范) 是GB2312的扩展, 按理说 都属于 双字节编码,码位是一样的,根本谈不上扩展,

但实际上是 预留空间在起作用。

GBK 字符集中所有中文字符和全角符号 占 2个字节,字母和 半角符号占一个字节。

(3)多字节

unicode 字符集国际标准字符集,它将世界各种语言的每个字符定义一个 唯一的编码 ,以满足跨语言,跨平台的文本信息转换。

有多个编码方式, 分别是 UTF-8, UTF-16, UTF-32 编码

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

 

UTF-8:   一种 变长的编码 方案,使用 1-6 个字节来储蓄;

UTF-32:  一种固定长度的 编码方案,  不管字符编号大小,始终 使用4个字节来储蓄;

UTF-16:  使用2个字节 或 4个字节 来储蓄,长度即固定又可变。

UTF-8

编码为 1-4 个字节,具体取决于 有效位的数量。

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

unicode 编码(16进制)               UTF-8字节流 (二进制)

000000 - 00007F                    0xxxxxxx     //ascii码

000080 - 0007FF                    110xxxxx    10xxxxxx

000800 - 00FFFF                    1110xxxx     10xxxxxx  10xxxxxx

010000 - 10FFFF                      11110xxx     10xxxxxx  10xxxxxx

 

UTF-8  没有 两端的说法 ,就是 大端 “大 -中 -小”。

 

举例

“严” 

unicode  码是  4E25,  

二进制就是    01001110 00100101 

填充后:1110 0100 10 111000 10 100101 共计 24位 占 3个字节

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

UTF-16

它 使用 2个 或  4个 字节来存储。

  1.   对于Unicode  编号 范围在 0- FFFF 之间的字符,UTF-16 使用两个字节存储,并且直接存储Unicode 编号,不用进行编码转换。
  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

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

 

UTF BOM头

BOM (Byte Order Mark ) 字节序,其实就是  用大端还是 小端。

 

比如:UTF-16BE  和 UTF-16LE:

 

UTF-16BE, 其后缀是  BE  即  big-endian,     大端,就是将高位的字节 放在低地址 表示

UTF-16LE, 其后缀是  LE   即  little-endian,   小端,就是将高位的字节 放在高地址 表示

 

UTF 在文件中的存储。 UTF格式在文件中总有固定文件头:

UTF 编码                       Byte Order Mark

UTF-8                            EF BB BF    // 注意 UTF-8 缺省不带 BOM

UTF-16LE                      FF FE

UTF-16BE                      FE FF

UTF-32LE                      FF FE 00 00

UTF-32BE                      00 00 FE FF

 

汉 在文件中的存储(不包括头):

 

Unicode 编码      UTF-16LE      UTF-16BE         UTF32-LE      UTF32-BE             UTF8

0x006C49           49 6C             6C 49             49 6C 00 00   00 00 6C 49         E6B189

 

 

UTF-8缺省不带BOM

UTF-8  没有 两端的说法 ,就是 大端 “大 -中 -小”。

字符集相关命令

file   //查看文件的编码方式

 

iconv  

 

iconv -f  encoding  [-t encoding]  [inputfile] …

 

查看支持的格式 iconv -l

 

5  字符集转换编程

 

http://www.gnu.org/software/libiconv/documentation/libiconv-1.13/

 

包含头文件

#include  <iconv.h>

 

iconv_open

 

iconv_close

iconv(…)

 

iconv_t iconv_open (const char* tocode, const char* fromcode); 

iconv_t cd = iconv_open(“UTF-8”, “UTF-8”); 

 

int iconv_close (iconv_t cd); 

iconv_close(cd); 

 

size_t iconv (iconv_t cd, const char* * inbuf, size_t * inbytesleft, char* * outbuf, 

size_t * outbytesleft); 

 -1 说明出现异常,错误码

E2BIG   outbuf 没有足够的空间

EILSEQ   遇到无效的多字节序列

EINVAL   遇到不完整的多字节序列

 

6 字符集应用案例

 

mysql

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

 

比如  (煕) utf8模式下 需要 4个字节表示

myslq utf8  不是真正的utf-8 ,  它的 utf8   只支持每个字符 最多 3个字节。

真正的utf8 只少要支持4个字节。

mysql 一直没有修复这个bug 他们在 2010年发布的 utf8mb4 才是真正的“UTF-8.

 

 

 

nignx 配置字符集

conf 文件需要加入 charset utf-8;

 

redis 命令行出现乱码

 

set 中文 value  时 再get 出现 乱码 

启动时 附加 —raw 参数 即可 。

redis-cli —raw

 

 

链接:

GBK 内码查询 

http://www.mytju.com/classcode/tools/encode_gb2312.asp

 

查看完整的 Unicode 字符集 ,以及各种编码方式

https://unicode-table.com/cn/

Unicode 和 UTF 编码转换 

https://www.qqxiuzi.cn/bianma/Unicode-UTF.php

汉字字符集编码查询

https://www.qqxiuzi.cn/bianma/zifuji.php

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值