字符编码

网站转码工具


中文编码

兼容性(包含)关系: GB18030兼容GBK,GBK兼容GB2312,GB2312兼容ASCII
ASCII:

ASCII 是目前最简单也是最通用的字符集,每个字符占据1bytes,
用二进制表示的话最高位必须为0(扩展的ASCII不在考虑范围内),因此ASCII只能表示128个字符,包含数字,大小写字母以及常用的英文标点符号。

GB2312:

GB2312是一个字符集,每个字占据2bytes,为了兼容ASCII这2bytes最高位不可以为0。
全称“信息交换用汉字编码字符集”(GB是“国标”的拼音缩写,2312是国标序号),包含6763个汉字以及682个特殊符号。当文本中的字节小于0x80,为ASCII码,而当文本中的字节大于0x80时,此字节加下一个字节共同表示一个汉字。

GBK:

GBK也是一个字符集,是GB2312的扩充(K是“扩”的拼音缩写),包含21003个汉字(包括繁体字)和984个汉语标点符号、部首,兼容GB2312

GB18030 :

GB18030也是一种字符集,兼容GBK,对GBK多出来的汉字使用4bytes编码。
当然,为了兼容GBK,这个四字节的前两位显然不能与GBK冲突,至2005年发布,GB18030编码的中文文件已经有70244个汉字了,包含了少数民族文字。

类别 码位范围 码位数 字符数 字符类型
双字节部分 第一字节 0xB0-0xF7
第二字节 0xA1-0xFE
6768 6763 汉字
第一字节0x81-0xA0
第二字节0x40-0xFE
6080 6080 汉字
第一字节0xAA-0xFE
第二字节0x40-0xA0
8160 8160 汉字
四字节部分 第一字节0x81-0x82
第二字节0x30-0x39
第三字节0x81-0xFE
第四字节0x30-0x39
6530 6530 CJK统一汉字扩充A
第一字节0x95-0x98
第二字节0x30-0x39
第三字节0x81-0xFE
第四字节0x30-0x39
42711 42711 CJK统一汉字扩充B

我们通常把GB2312字符集这6763字称为“常用字”
而将包含在GBK而不包含在GB2312字符集内的汉字称为“生僻字”。

GBxxx都是我们国家定义的标准,当然只针对我们国家的汉字以及ASCII等。而unicode的出现是为了解决全球的字符编码。


国际编码

编码格式 = 编码格式 + 存储格式 对于GBxxx是将编码和存储方式整合再一起了,我们叫字符集。

UNICODE:

unicode只是编码,不涉及存储格式
而utf-x是基于unicode编码的编码格式,通常包含utf-8、utf-16、utf-32三种。
对于utf-8、utf-16、utf-32三者都使用unicode编码,但存储格式存在差异,它的字符编码中的每个字节都可以小于0x80

在Unicode 5.0的99089个字符中,有71226个字符与汉字有关。它们的分布如下:

Block名称 开始码位 结束码位 字符数
CJK统一汉字 4E00 9FBB 20924
CJK统一汉字扩充A 3400 4DB5 6582
CJK统一汉字扩充B 20000 2A6D6 42711
CJK兼容汉字 F900 FA2D 302
CJK兼容汉字 FA30 FA6A 59
CJK兼容汉字 FA70 FAD9 106
CJK兼容汉字补充 2F800 2FA1D 542

GB2312中的6763个汉字在Unicode中不是连续的,分布在CJK统一汉字字符区(0x4E00-0x9FA5)的20902个汉字中
GBK中的21003个汉字包含在CJK统一汉字字符区的20902个汉字,剩余的101个在不同的区域.

UTF8

UTF-8(Unicode Transformation Format 8-bit)编码是一种可变宽度的编码格式,是用以解决兼容国际字符的一种多字节编码。

对于英文字符较多的论坛则用UTF-8节省空间。另外,如果是外国人访问你的GBK网页,需要下载文语言包支持,访问UTF-8编码的网页则不出现这问题,所以现在一般的网页都是使用utf-8编码。
  • 1.它是一个变长字节(1~4个字节)的编码方式。
  • 2.对于一个字节的编码格式:字节bit[7:0]的bit[7]位必须为0,bit[6:0]这7个位用来编码,即二进制为0b0xxxxxxx。
  • 3.对于n字节(2,3,4个字节)的编码格式,用首字节的bit[7:8-n]位置1,bit[8-n-1]置位0表示字节位数。
    如首字节为0b110xxxxx表示二字节的编码格式。同理0b1110xxxx为三字节格式。剩下的除首字节剩下的字节的bit[7:6]=0b10.其余位用于编码。如编码0b1110xxxx,0b10xxxxxx,0b10xxxxxx表示一个三字节的编码格式,其中x代表的是可编码的位置,可以计算出三字节编码格式共有2^24个编码位置。
字节数 utf-8 编码格式 编号范围
1 0b0xxxxxxx 0x00~0x7F
2 0b110xxxxx 0b10xxxxxx 0x80~0x7FF
3 0b1110xxxx 0b10xxxxxx 0b10xxxxxx 0x800~0xFFFF
4 0b11110xxx 0b10xxxxxx 0b10xxxxxx 0b10xxxxxx 0x10000~0x10FFFF

unicode转utf-8步骤:

  1. 首先找到unicode字符编码所在上表中的编号范围。如字符A的unicode编码为0x41,位于utf-8 1字节编码格式(0~127)的编号范围
  2. .将unicode字符编码的二进制位从右到左填入上表中的x位(注意要去掉高位的0)。如字符A(0x41=0b01010001)去掉高位0则为0b1010001。将其填入0b0xxxxxxx后则为0b01010001.也就是utf-8字符A的编码值。
    再举个例子:汉字郭的unicode字符编码为0x90ED(0b10010000,11101101),由0x800 < 0x90ED < 0xFFFF得到它的编码格式为utf-8的3字节编码格式。然后将其二进制0b10010000,11101101填入0b1110xxxx 0b10xxxxxx 0b10xxxxxx后为0b11101001,10000011,10101101=0xE983AD.也就是utf-8字符郭的编码值

c++ unicode转utf-8代码:

/* * utf-8字符编码转化为unicode编码。(2字节模式)* pIn:要转换的字符串首地址* charsize:接收返回的utf8字符的字节数(1~3)* pOut:获取到的UCS2编码,pOut[0]为首字节。*/
int Utf8ToUCS2(const char *pIn,char *charsize,char *pOut)
{uint8_t firstValue = *pIn;char *pUCS2 = pOut;if(firstValue < 0x80){//0~127 ASCII 1bytepUCS2[0] = 0;pUCS2[1] = *pIn;*charsize = 1;}else if( (firstValue & 0xE0) == 0xC0){//128~2047 2byteif( (pIn[1] & 0xC0) != 0x80){return -1;}pUCS2[0] = (pIn[0] & 0x1F) >> 2;pUCS2[1] = (pIn[0] << 6) + (pIn[1] & 0x3F);*charsize = 2;}else if( (firstValue & 0xF0) == 0xE0){//2048~65536 3byteif( (pIn[1] & 0xC0) != 0x80 || (pIn[2] & 0xC0) != 0x80){return -1;}pUCS2[0] = (pIn[0] << 4) + ((pIn[1] & 0x3F) >> 2);pUCS2[1] = (pIn[1] << 6) + (pIn[2] & 0x3F);*charsize = 3;}else {//>3byte不处理,汉字用不到4字节的编码*charsize = 0;return -1;}return 0;
}

编码格式记录 GBK GB18030 GB2312 ASCII 和 UTF8 UNICODE相关推荐

  1. utf8转gb2312 c语言,UTF-8, Unicode, GB2312格式串转换之C语言版

    (申明:此文章属于原创,若转载请表明作者和原处链接 ) /*      author:   wu.jian   (吴剑)      English name: Sword /*      date:  ...

  2. linux c语言 utf8转gbk,GBK(gb2312)和UTF-8互转(转载)

    本文摘自:http://my.huhoo.net/archives/2012/10/gbkutf8.html 非常感谢原文作者. 具体需求是这样,嵌入式环境,sh架构的,厂商提供的SDK中的iconv ...

  3. 大端小端,ascii,unicode,utf8,utf16,utf32,gb2312,gbk,gb18030等字符编码问题

    字符编码的问题让我困惑了好久的一段时间,其实简单的想,字符编码没有什么东西的,可是想真弄明白还是花去了我一点时间,前端时间写了一个简单的log程序,主要的工作就是支持系统运行时输出日志信息,同时允许定 ...

  4. 浅谈UTF-8、GBK、gb2312

    字符必须编码后才能被计算机处理.计算机使用的缺省编码方式就是计算机的内码.早期的计算机使用7位的ASCII编码,为了处理汉字,程序员设计了用于简体中文的GB2312和用于繁体中文的big5. GB23 ...

  5. xp mysql字符集与乱码_mysql字符集(GBK、GB2312、UTF8)与中文乱码的原因及解决

    Mysql乱码问题的原因与解决 MySQL对中文的支持程度还是很有限的,尤其是新手,一旦出现乱码问题,就会头大.下面介绍几种乱码问题的现象原因及解决方法,仅供参考. 乱码问题1:用PHPmyAdmin ...

  6. mysql中gbk编码汉字和英文_MySQL字符集 GBK、GB2312、UTF8区别 解决 MYSQL中文乱码问题...

    MySQL中涉及的几个字符集 character-set-server/default-character-set:服务器字符集,默认情况下所采用的. character-set-database:数 ...

  7. mysql utf8和gbk的区别_MySQL字符集 GBK、GB2312、UTF8区别

    MySQL中涉及的几个字符集 character-set-server/default-character-set:服务器字符集,默认情况下所采用的. character-set-database:数 ...

  8. mysql设置字符集gb2312_MySQL字符集 GBK、GB2312、UTF8區別 解決 MYSQL中文亂碼問題

    MySQL中涉及的幾個字符集 character-set-server/default-character-set:服務器字符集,默認情況下所采用的. character-set-database:數 ...

  9. mysql gbk_MySQL字符集 GBK、GB2312、UTF8区别 解决MYSQL中文乱码问题

    MySQL字符集 GBK.GB2312.UTF8区别 解决MYSQL中文乱码问题 更新时间:2012年08月27日 21:17:11   作者: MYSQL中文乱码问题原因有很多,脚本之家以前发布过很 ...

最新文章

  1. @responseBody和@RequestBody
  2. C#中一些易混知识的比较
  3. 001考试类小程序设计方案简要需求分析和数据库简要设计
  4. 网易云信牵手有道乐读,解密「终身阅读者」背后的技术力量
  5. 记-纯前端excle下载
  6. java I/O 以及文件编码
  7. 输入控件tagsinput
  8. SQL Server 统计信息更新时采样百分比对数据预估准确性的影响
  9. fdisk自动进行分区
  10. Video Target Tracking Based on Online Learning—TLD多目标跟踪算法
  11. Google浏览器调试页面时设置分辨率
  12. 中文汉化AE扩展脚本 AtomX 3.0.0 不断更新预设包文件
  13. 001简介-QQ群淘宝客软件开发详解
  14. 深圳的住房公积金的那些事儿~(缴纳标准,用处用法)
  15. Elasticsearch(ES)入门,这一篇就够了
  16. Java实现微信公众号客服功能和本地联调
  17. python白_Python小白到底有多白?
  18. 苹果 WWDC 2019 全记录:iPadOS独立、SwiftUI、Project Catalyst
  19. 爬取全国各地区汽车销量情况并用中国地图可视化展示
  20. SAP批量查询组件BOM引用报表

热门文章

  1. 计算机文字处理的基本过程,计算机基础文字处理实验报告.doc
  2. 中专计算机应用专业建设思路,以信息化教学资源建设促进中职计算机专业建设的研究...
  3. C语言--PTA三天打渔两天晒网问题
  4. centos7修改mysql初始密码
  5. ES6学习笔记(字符串扩展)
  6. 【EdgeX(11)】 :通过研究openvino项目发现一个好东西,CVAT项目数据标注工具,可以使用docker-compose进行本地部署,本地局域网中使用,也非常安全
  7. 【问题记录】ABP 记一处细节变化
  8. 移动端超级实用工具Scrcpy操作分享 (上)
  9. 《计算机组成与CPU设计实验》实验2 七段译码器实验
  10. SPOJ 1811 LCS,SPOJ 1812 LCS2【SAM裸题,clj的ppt很清楚