由于在工作中经常会遇到数据在各种不同数据库流转的需要,偶尔会碰到一些中文乱码的情况,借此机会,记录一下一些常见的字符集和字符编码。

字符:各种文字和符号的总称,包括各国家文字、标点符号、图形符号、数字等。

字符集:多个字符的集合,字符集种类较多,每个字符集包含的字符个数不同。

字符编码:把字符集中的字符编码为(映射)指定集合中的某一对象(例如:比特模式、自然数序列、电脉冲)的一种规则,以便文本在计算机中存储和通过通信网络的传递。通常特定的字符集采用特定的编码方式(即一种字符集对应一种字符编码(例如:ASCII、IOS-8859-1、GB2312、GBK,都是即表示了字符集又表示了对应的字符编码,但Unicode不是,它采用现代的模型))

常见字符集名称:ASCII字符集、GB2312字符集、BIG5字符集、GB18030字符集、Unicode字符集等。

计算机要准确的处理各种字符集文字,需要进行字符编码,以便计算机能够识别和存储各种文字。

首先咱们来认识下单字节和双字节的概念,在计算机中,1byte=8bit,byte即字节,bit为位,1字节为8位;注:在本文示例中,“x”代表0或1

单字节 xxxxxxxx
        双字节 xxxxxxxx xxxxxxxx

ASCII字符集:ASCII ((American Standard Code for Information Interchange): 美国信息交换标准代码)是基于拉丁字母的一套电脑编码系统,主要用于显示现代英语和其他西欧语言。它是最通用的信息交换标准,并等同于国际标准ISO/IEC 646。ASCII第一次以规范标准的类型发表是在1967年,最后一次更新则是在1986年,到目前为止共定义了128个字符。

我们今天首先来讲讲ASCII字符集,首先来看ASCII字符集包含了哪些字符:


ASCII字符集采用的是单字节编码,且只使用了单字节中的低7位,最高位是没有使用的,可表示为0xxxxxxxx;可以看到,ASCII字符集共包含128个字符,在英语国家中,128个字符是基本够用的,但是,在其他国家语言中,比如,在法语中,字母上方有注音符号,它就无法用 ASCII 码表示。于是,一些欧洲国家就决定,利用字节中闲置的最高位编入新的符号。比如,法语中的é的编码为130(二进制10000010)。这样一来,这些欧洲国家使用的编码体系,可以表示最多256个符号。但是,这里又出现了新的问题。不同的国家有不同的字母,因此,哪怕它们都使用256个符号的编码方式,代表的字母却不一样。比如,130在法语编码中代表了é,在希伯来语编码中却代表了字母Gimel (ג),在俄语编码中又会代表另一个符号。但是不管怎样,所有这些编码方式中,0--127表示的符号是一样的,不一样的只是128--255的这一段。

至于亚洲国家的文字,使用的符号就更多了,汉字就多达10万左右。一个字节只能表示256种符号,肯定是不够的,就必须使用多个字节表达一个符号。比如,简体中文常见的编码方式是 GB2312,使用两个字节表示一个汉字,所以理论上最多可以表示 256 x 256 = 65536 个符号。

GB2312编码:1980年3月9日发布,1981年5月1日实施的简体中文汉字编码国家标准,“GB”就是”国标“二字的简称,GB2312对汉字采用双字节编码,收录7445个图形字符,其中包括6763个汉字。

GB2312字符集构成一个94行、94列的二维表,每一个汉字或符号在码表中的位置用它所在的区号和位号来表示,称为区位码,区位码中数字的表示采用的都是十进制。ASCII采用的是单字节编码方式,而GB2312采用的则是双字节编码,第一个字节为“高字节”,即区号,第二个字节为”低字节“,即位号;每个区都是从01到94,所以区位码可表示的字符个数范围为0101-9494,二进制表示为(00000001 000000001-01011110 01011110),目前有一部分区留空未使用,具体情况如下:

01-09区收录除汉字外的682个字符。
10-15区为空白区,没有使用。
16-55区收录3755个一级汉字,按拼音排序。
56-87区收录3008个二级汉字,按部首/笔画排序。
88-94区为空白区,没有使用。

此处以1区和16区来举例,1区中的“。”的区号是01(二进制表示为0001),位号是03(二进制为0011),则“。”的区位码是0103(00000001 00000011),16区中的“啊”的区位码是1601(00010000 00000001)

1区
  0 1 2 3 4 5 6 7 8 9
0     · ˉ ˇ ¨
1
2
3 ± × ÷
4
5
6 °
7 ¤ §
8
9          
16区
  0 1 2 3 4 5 6 7 8 9
0  
1
2
3
4
5
6
7
8
9          

区位码无法用于汉字通信,因为它可能与通信使用的控制码(00H~1FH)(即0~31)发生冲突,即ASCII字符集中的控制字符(0~31)发生冲突。ISO2022规定每个汉字的区号和位号必须分别加上32(即二进制数00100000),经过这样的处理而得的代码称为国标交换码,简称交换码,所以,“啊”字的交换码换算方式为:

00010000   00000001
+00100000 +00100000 
---------------------------------
  00110000   00100001

虽然解决了不能通信的问题,但是,几乎很多的文本中都存在中英文混杂的现象,GB2312是双字节编码,ASCII是单字节编码,在使用过程中,如果从双字节编码的方式转换成单字节编码时,就会出现混杂的情况,比如“啊” 字的交换码从上一步已知为:00110000   00100001 ,可以看到00110000  既可以表示双字节编码的GB2312字符集中“啊”字的高位字节,也可以表示单字节编码的ASCII字符集中的数字“0”;为了避免这种混杂情况的发生,就规定在交换码的基础上,将高位字节和地位字节的最高位都由0变更为1,整个换算过程如下图:

聊聊字符集(一)——ASCII字符集和GB2312字符集相关推荐

  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. mysql字符集和表字符集_Mysql数据库表引擎与字符集

    Mysql数据库表引擎与字符集 1.服务器处理客户端请求 其实不论客户端进程和服务器进程是采用哪种方式进行通信,最后实现的效果都是:客户端进程向服务器进程发送一段文本(MySQL语句),服务器进程处理 ...

  4. mysql字符集和表字符集_设置数据库的字符集和设置表字段字符集的区别是什么?...

    对于oracle来说,只有数据库字符集这个说法,不存在什么表字符集和字段字符集.你说的这个是mysql的字符集,数据库字符集可以和表字符集不同,也可以和列字符集不同,也就是说,你的数据库字符集为utf ...

  5. linux 文件 字符集设置,Linux字符集和系统语言设置-LANG,locale,LC_ALL,POSIX等命令及参数详解...

    博文说明[前言]: 本文将通过个人口吻介绍Linux字符集和系统语言设置,包括LANG,locale,LC_ALL,POSIX等命令及参数详解的相关知识,在目前时间点[2017年6月21号]下,所掌握 ...

  6. 使用 _tprintf 宏兼容多字节字符集和Unicode字符集

    我们知道在windows平台上写C程序要考虑字符编码问题,为了兼容多字节字符集和Unicode,涉及字符,字符串操作,都要用TEXT宏围起来. 如果要使用printf,但是不确定字符集,可以使用 _t ...

  7. C++ 中ACSII字符集和Unicode字符集转换

    #include "stdio.h" #include "iostream" #include "string" #include &quo ...

  8. 如何查看linux系统的字符集,Linux系统查看字符集和修改字符集(以CentOS为例)

    一.查看字符集 Linux字符集在系统中体现形式是一个环境变量,以CentOS6.5为例,其查看当前终端使用字符集的方式可以有以下四种方式: 第一种: [root@Testa-www tmp]# ec ...

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

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

最新文章

  1. springboot中下面哪一个作为jpa默认实现_35个超高频SpringBoot知识点(附解析),别怪我没给你机会收藏...
  2. 汇编解析(5)-intel的奔4的netburst控制单元技术提高指令处理速度
  3. Comparable与Comparator用法详解
  4. AQS理解之七——AQS中的条件队列
  5. hdu 4349——Xiao Ming's Hope
  6. 携程赴港二次上市在即 “旅游营销枢纽”战略助价值重估
  7. Vue学习心得记录之模板语法
  8. 应用程序架构指导袖珍版
  9. Preparedstatement和statement 区别
  10. 中小学计算机中级班教学目标,计算机中级考试教学目标
  11. Javascript加号的作用、数据类型、输入用户的输入第四课
  12. mysql 附近3公里的,mysql 查询附近N公里内数据
  13. 微信小程序系列(3)如何用微信小程序写一个论坛?贴心代码详解(一)发帖
  14. opencv python 的基本操作案例(一) 记录,可查看
  15. nginx CDN源站设置与回源host
  16. python如何提取数据中的年月_Python数据处理笔记——Pandas时间数据提取处理
  17. 硬件趣学python_硬的解释|硬的意思|汉典“硬”字的基本解释
  18. 仅仅允许本校报考?多所985/211大学计算机第二学士学位
  19. 做出刷屏文字的6大哲学
  20. 【python爬虫实战】批量下载网站视频

热门文章

  1. 风丘方案助力车企升级 解决“国六”标准新难题
  2. Kotlin 协程 (5/7篇) - 响应式编程(冷流) Flow
  3. 想要将自己的胸肌锻炼的更好看,其实是比较不容易的
  4. cass2008-中小比例尺---查询属性错误---待解决
  5. winform屏蔽Alt+F4组合键以防止用户关闭对话框
  6. ftp_mdtm() 函数
  7. FPGA—IIC 设计
  8. 【美】柯蒂斯·费思 - 海龟交易法则(2012年12月25日)
  9. Microchip(微芯)资料下载地址
  10. 外网访问Openwrt路由器管理Web及SSH