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

  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

unicode字符集和utf-8编码相关推荐

  1. 转:Unicode字符集和多字节字符集关系

    原文地址: http://my.oschina.net/alphajay/blog/5691 unicode.ucs-2.ucs-4.utf-16.utf-32.utf-8 http://stallm ...

  2. Unicode字符集和多字节字符集关系(一)

    另外可参考: 谈谈Unicode编码,简要解释UCS.UTF.BMP.BOM等名词 http://blog.csdn.net/smonster/archive/2008/10/31/3194587.a ...

  3. VS2005 宽字符 unicode字符集和多字节字符集

    在vs2005以前版本的vs默认使用多字节字符集,而vs2005默认使用unicode字符集,这会使一些代码不能编译通过 其区别如下 unicode字符集 void Point::output(int ...

  4. 字符集和字符编码(Charset Encoding)

    字符集和字符编码 一文参透字符编码的难题! 引子 在 python 中,处理字符串是常见任务,因为字符串编码问题,经常出现字符串乱码. 在 matplotlib 绘图时,text对象,如 axes_t ...

  5. Unity中获取字符串长度、Unicode字符数量和编码ASCII,UTF,GBK的区别

    1.String.Length,String.ToCharArray,StringInfo,Encoding.UTF8.GetByteCount的区别: String.Length:获取的是字符串中C ...

  6. [转]各种字符集和编码详解

    在软件的编码和实现中,我们可能会碰到个 一个比较头疼的问题--编码,不同字符间的编码和解码,你确定了解各种字符的编码吗?一个朋友问到了我这个问题,我虽然能回答一两个出来,但是感觉已经有点模糊,混乱了, ...

  7. 字符,字节和编码, ASCII码, DBCS码,SBCS码 与Unicode码

    字符,字节和编码, ASCII码, DBCS码,SBCS码 与Unicode码 http://www.regexlab.com/zh/encoding.htm 1. 编码问题的由来,相关概念的理解 1 ...

  8. Unicode字符是什么?

    Unicode 是一种重要的交互和显示的通用字符编码标准,它覆盖了美国.欧洲.中东.非洲.印度.亚洲和太平洋的语言,以及古文和专业符号.Unicode 允许交换.处理和显示多语言文本以及公用的专业和数 ...

  9. 字符集和编码规范:ASCII,Unicode和UTF-8, latin1,BIG5,GBK

    字符集和编码方式:ASCII,Unicode和UTF-8, latin1,BIG5,GBK 参考: 字符集 字符集编码详解 一. ASCII码 我们知道,在计算机内部,所有的信息最终都表示为一个二进制 ...

  10. 字符集和编码 UNICODE、ANSI、UTF-8、GB2312 都是什么鬼

    这是我在网上看到的一篇通俗易懂的教程,但是无法找到原作者的署名,故直接搬过来了 不是本人所作,特此声明 快下班时,爱问问题的小朋友Nico又问了一个问题: "sqlserver里面有char ...

最新文章

  1. .NET中SQL Server数据库连接方法
  2. 环境变量和用户变量有什么区别?
  3. 手机抓包app_Python爬取网站上面的数据很简单,但是如何爬取APP上面的数据呢
  4. python与正则表达式(part8)--compile对象及match对象的属性方法
  5. 最后一条记录_幸好朋友圈没有访客记录。
  6. [react] 怎样使用Hooks获取服务端数据?
  7. Spring之ApplicationContextAware接口详解
  8. python中oserror捕获_Python assert异常处理(一看即懂)
  9. 匿名函数php作用,深入理解PHP中的匿名函数
  10. 一道面试题:用多线程求1000以内的素数有多少个?并给出消耗时间
  11. hibernate的一级缓存问题
  12. Ubuntu 定时开关机
  13. Windows超级好用的离线截图贴图工具
  14. 遗传算法与TSP问题
  15. 腾讯信鸽推送,部分手机不能接收到推送弹窗
  16. 性能测试实战脚本—服务器端性能测试的通用脚本
  17. 汉字转拼音,并返回第一个字母
  18. vmware运行虚拟机ubuntu,电脑就重启
  19. 三条中线分的六个三角形_三角形三条中线的交点叫什么
  20. 架构师提升技术影响力的三个阶段(一)

热门文章

  1. 论文查重前应删掉哪些内容?
  2. 小白做淘客店铺新玩法
  3. mapboxgl 互联网地图纠偏插件(三)
  4. java解压zip和rar文件
  5. cmd关闭kill进程
  6. 移动通信核心网技术总结(五)IMS的信令流程及VoLTE的实现
  7. 会声会影安装闪退解决办法_会声会影导出时闪退怎么回事 - 卡饭网
  8. matlab 运动控制系统设计与实现,电力传动控制系统:运动控制系统
  9. radius mysql md5_radius协议采用什么传输 radius协议中md5加密函数的参数怎么处理
  10. matlab中plot3,mesh,grid三者画图的区别