unicode字符集和utf-8编码
字符集 和字符编码的关系:
- 字符集 是 书写系统字母与符号的集合
- 字符编码则是 将字符映射为一 特定的字节 或字节序列, 是一种规则。
- 通常特定的字符集 采用特定的编码方式(即一种字符集 对应一种字符编码,例如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个 字节来存储。
- 对于Unicode 编号 范围在 0- FFFF 之间的字符,UTF-16 使用两个字节存储,并且直接存储Unicode 编号,不用进行编码转换。
- 对于 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编码相关推荐
- 转:Unicode字符集和多字节字符集关系
原文地址: http://my.oschina.net/alphajay/blog/5691 unicode.ucs-2.ucs-4.utf-16.utf-32.utf-8 http://stallm ...
- Unicode字符集和多字节字符集关系(一)
另外可参考: 谈谈Unicode编码,简要解释UCS.UTF.BMP.BOM等名词 http://blog.csdn.net/smonster/archive/2008/10/31/3194587.a ...
- VS2005 宽字符 unicode字符集和多字节字符集
在vs2005以前版本的vs默认使用多字节字符集,而vs2005默认使用unicode字符集,这会使一些代码不能编译通过 其区别如下 unicode字符集 void Point::output(int ...
- 字符集和字符编码(Charset Encoding)
字符集和字符编码 一文参透字符编码的难题! 引子 在 python 中,处理字符串是常见任务,因为字符串编码问题,经常出现字符串乱码. 在 matplotlib 绘图时,text对象,如 axes_t ...
- Unity中获取字符串长度、Unicode字符数量和编码ASCII,UTF,GBK的区别
1.String.Length,String.ToCharArray,StringInfo,Encoding.UTF8.GetByteCount的区别: String.Length:获取的是字符串中C ...
- [转]各种字符集和编码详解
在软件的编码和实现中,我们可能会碰到个 一个比较头疼的问题--编码,不同字符间的编码和解码,你确定了解各种字符的编码吗?一个朋友问到了我这个问题,我虽然能回答一两个出来,但是感觉已经有点模糊,混乱了, ...
- 字符,字节和编码, ASCII码, DBCS码,SBCS码 与Unicode码
字符,字节和编码, ASCII码, DBCS码,SBCS码 与Unicode码 http://www.regexlab.com/zh/encoding.htm 1. 编码问题的由来,相关概念的理解 1 ...
- Unicode字符是什么?
Unicode 是一种重要的交互和显示的通用字符编码标准,它覆盖了美国.欧洲.中东.非洲.印度.亚洲和太平洋的语言,以及古文和专业符号.Unicode 允许交换.处理和显示多语言文本以及公用的专业和数 ...
- 字符集和编码规范:ASCII,Unicode和UTF-8, latin1,BIG5,GBK
字符集和编码方式:ASCII,Unicode和UTF-8, latin1,BIG5,GBK 参考: 字符集 字符集编码详解 一. ASCII码 我们知道,在计算机内部,所有的信息最终都表示为一个二进制 ...
- 字符集和编码 UNICODE、ANSI、UTF-8、GB2312 都是什么鬼
这是我在网上看到的一篇通俗易懂的教程,但是无法找到原作者的署名,故直接搬过来了 不是本人所作,特此声明 快下班时,爱问问题的小朋友Nico又问了一个问题: "sqlserver里面有char ...
最新文章
- .NET中SQL Server数据库连接方法
- 环境变量和用户变量有什么区别?
- 手机抓包app_Python爬取网站上面的数据很简单,但是如何爬取APP上面的数据呢
- python与正则表达式(part8)--compile对象及match对象的属性方法
- 最后一条记录_幸好朋友圈没有访客记录。
- [react] 怎样使用Hooks获取服务端数据?
- Spring之ApplicationContextAware接口详解
- python中oserror捕获_Python assert异常处理(一看即懂)
- 匿名函数php作用,深入理解PHP中的匿名函数
- 一道面试题:用多线程求1000以内的素数有多少个?并给出消耗时间
- hibernate的一级缓存问题
- Ubuntu 定时开关机
- Windows超级好用的离线截图贴图工具
- 遗传算法与TSP问题
- 腾讯信鸽推送,部分手机不能接收到推送弹窗
- 性能测试实战脚本—服务器端性能测试的通用脚本
- 汉字转拼音,并返回第一个字母
- vmware运行虚拟机ubuntu,电脑就重启
- 三条中线分的六个三角形_三角形三条中线的交点叫什么
- 架构师提升技术影响力的三个阶段(一)