Unicode字符集下UTF-8 、UTF-16编码和GBK(GB2312)字符集
Unicode 是「字符集」
Unicode为世界上所有字符都分配了一个唯一的数字编号,这个编号范围从 0x000000 到 0x10FFFF(十六进制),有110多万,每个字符都有一个唯一的Unicode编号,这个编号一般写成16进制。例如「知」的码位是 30693,记作 U+77E5(30693 的十六进制为 0x77E5)。
它是一种规定,Unicode本身只规定了每个字符的数字编号是多少,并没有规定这个编号如何存储。
Unicode是定长的都为双字节。
UTF-8 是「编码规则」
Unicode是一个字符集,而UTF-8是Unicode的其中一种,Unicode是定长的都为双字节,而UTF-8是可变的,对于汉字来说Unicode占有的字节比UTF-8占用的字节少1个字节。Unicode为双字节,而UTF-8中汉字占三个字节。
其中: 字符集:为每一个「字符」分配一个唯一的 ID(学名为码位 / 码点 / Code Point)
编码规则:将「码位」转换为字节序列的规则(编码/解码 可以理解为 加密/解密 的过程)
UTF-8 顾名思义,是一套以 8 位为一个编码单位的可变长编码。会将一个码位编码为 1 到 4 个字节这个变化是根据 Unicode 编号的大小有关,编号小的使用的字节就少,编号大的使用的字节就多。
UTF-8使用1~4字节为每个字符编码:
·一个US-ASCIl字符只需1字节编码(Unicode范围由U+0000~U+007F)。
·带有变音符号的拉丁文、希腊文、西里尔字母、亚美尼亚语、希伯来文、阿拉伯文、叙利亚文等字母则需要2字节编码(Unicode范围由U+0080~U+07FF)。
·其他语言的字符(包括中日韩文字、东南亚文字、中东文字等)包含了大部分常用字,使用3字节编码。
·其他极少使用的语言字符使用4字节编码
UTF-8是这样做的:
1. 单字节的字符,字节的第一位设为0,对于英语文本,UTF-8码只占用一个字节,和ASCII码完全相同;
2. n个字节的字符(n>1),第一个字节的前n位设为1,第n+1位设为0,后面字节的前两位都设为10,这n个字节的其余空位填充该字符unicode码,高位用0补足。
Unicode符号范围 | UTF-8编码方式 (十六进制) | (二进制) ----------------------+--------------------------------------------- 0000 0000-0000 007F | 0xxxxxxx 0000 0080-0000 07FF | 110xxxxx 10xxxxxx 0000 0800-0000 FFFF | 1110xxxx 10xxxxxx 10xxxxxx 0001 0000-0010 FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
因此:是任何字符对应的数字保存时所占的空间是可变的,使用一至四个字节为每个字符编码,其中大部分汉字采用三个字节编码,少量不常用汉字采用四个字节编码.而UTF-8由于里面有额外的标志信息,所有一个字节只能表示2的7次方128个字符,两个字节只能表示2的11次方2048个字符,而三个字节能表示2的16次方,65536个字符。
UTF-16
UTF-16:使用二或四个字节为每个字符编码,其中大部分汉字采用两个字节编码,少量不常用汉字采用四个字节编码。是任何字符对应的数字都用两个字节来保存,但如果都是英文字母(一个字节能表示一个字符)这样做有点浪费。由于UTF-16不需要用其它字符来做标志,所以两字节也就是2的16次能表示65536个字符
GB2312字符集
GBK是国家标准GB2312基础上扩容后兼容GB2312的标准。GBK的文字编码是用双字节来表示的,即不论中、英文字符均使用双字节来表示,为了区分中文,将其最高位都设定成1。GBK包含全部中文字符,是国家编码,通用性比UTF8差,不过UTF8占用的数据库比GBK大.
GBK、GB2312等与UTF8之间都必须通过Unicode编码才能相互转换:
GBK、GB2312--Unicode--UTF8
UTF8--Unicode--GBK、GB2312
具体见:
Windows下,Unicode、UTF8,GBK(GB2312)互转_小飞侠hello的博客-CSDN博客_gbk转gb2312
Unicode字符集下UTF-8 、UTF-16编码和GBK(GB2312)字符集相关推荐
- 你不知道的 字符集和编码(编码字符集与字符集编码)
我的上篇文章,有朋友提出字符集和编码的区别,我在此立文和大家讨论下 常说的字符集和编码区别,其实就是编码字符集和字符集编码的区别,其实,单单如果只是说字符集,没有任何编码的概念的话,那么字符集其实仅仅 ...
- ZendStudio中,缺少gbk gb2312编码的解决办法
自己用zend也好久了,对于文件的编码转换,也没太注意,可最近在新电脑上安装zend后, 由于文件是gbk编码的,默认utf-8编码会出现乱码, 于是,自己还是按照以前的方法 edit → Set E ...
- Unicode、UTF 和 ISO-8859-1等编码方式详解与浏览器URL编码
将字符转换为二进制码的过程,我们称为编码,将二进制码转换为字符的过程,我们称为解码. 编码和解码时所采用的规则,我们称为字符集 常见的字符集: ASCII - 美国人编码,使用7位来对美国常用的字符进 ...
- Unicode字符集下CString与char *转换 (解决中文乱码等)(转)
UniCode 下 CString 转 char* 的方法的文章有很多,但是大部分都是在互相转载,看了那么多资料,仍然没有解决乱码的问题,后来从一个论坛的一条回复里面找到了正确的方法,特此拿出来与大家 ...
- Unicode字符集下WriteFile中文处理
最近在使用WriteFile函数时发现,vc2008中unicode字符集下处理中文乱码的一些解决方法,归纳如下 1. 写入的时候采用多字节char类型 HANDLE hFile;DWORD nByt ...
- Unicode字符集下CString/tchar*与char *转换 (解决中文乱码等)
Unicode环境下宽字符------->窄字符的转换 定义:TCHAR m_szIp[MAX_IP_LEN]; 我们要将TCHANR类型数组(宽字符型)转换为char*pBuffer类型( ...
- 关于编码ansi、GB2312、unicode与utf-8的区别
关于编码ansi.GB2312.unicode与utf-8的区别 2014-01-25 08:51 529人阅读 评论(0) 收藏 举报 本文章已收录于: 关于编码ansi.GB2312.uni ...
- 【JAVA编码专题】JAVA字符编码系列一:Unicode,GBK,GB2312,UTF-8概念基础
这两天抽时间又总结/整理了一下各种编码的实际编码方式,和在Java应用中的使用情况,在这里记录下来以便日后参考. 为了构成一个完整的对文字编码的认识和深入把握,以便处理在Java开发过程中遇到的各种问 ...
- AJPFX解析关于编码ansi、GB2312、unicode与utf-8的区别
大家平时遇到乱码问题是否有自己的一套解决方案?这篇文章就是介绍一下常用的编码方式 关于编码ansi.GB2312.unicode与utf-8的区别 先做一个小小的试验: 在一个文件夹里,把一个txt文 ...
- 计算机ucs汉字编码,字符编码基础知识 - Unicode,UCS,GBK,GB2312,UTF-8
字符编码基础知识- Unicode,UCS,GBK,GB2312,UTF-8 最近遇到一个Unicode和UTF-8关系比较的问题,之前在处理中文显示时也遇到过类似的问题,于是花时间学习了一下,在此做 ...
最新文章
- 开平方的 7 种算法
- KVM虚拟机添加虚拟磁盘
- linux 中FTP服务器的架设
- 【深度学习】Transformer在语义分割上的应用探索
- Spring常见注解
- DW的代码格式化和净化功能
- 使用BeetleX网关对Web应用进行灰度发布
- oracle执行计划结果分析_优化体系--sql整体优化(调优工具分析)
- AutoCAD Electrical(ACE)的基本操作——新建项目、绘制电气原理图、线路标号
- java 获取图片后缀_java 自动识别图片文件类型 图片后缀 图片类型
- java 时间是24小时制吗_java时间24小时制
- 经典SQL练习——详细到令人发指(未完待续)
- 4.2 期货每日早盘操作建议
- 关于trigger的muting table异常
- Vue中的component
- kotlin中的var和val与编译时常量
- Ajax入门-搭建服务器并使用ajax技术向服务器发送一个请求并获得服务器返回的数据
- 177本名著浓缩成了177句话
- discuzx update sitekey.php,Discuz如何清除应用中心密码附加工具
- 【Python】 计算最大回撤率(金融工程)