聊聊字符集(一)——ASCII字符集和GB2312字符集
由于在工作中经常会遇到数据在各种不同数据库流转的需要,偶尔会碰到一些中文乱码的情况,借此机会,记录一下一些常见的字符集和字符编码。
字符:各种文字和符号的总称,包括各国家文字、标点符号、图形符号、数字等。
字符集:多个字符的集合,字符集种类较多,每个字符集包含的字符个数不同。
字符编码:把字符集中的字符编码为(映射)指定集合中的某一对象(例如:比特模式、自然数序列、电脉冲)的一种规则,以便文本在计算机中存储和通过通信网络的传递。通常特定的字符集采用特定的编码方式(即一种字符集对应一种字符编码(例如: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字符集相关推荐
- 转: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 ...
- mysql字符集和表字符集_Mysql数据库表引擎与字符集
Mysql数据库表引擎与字符集 1.服务器处理客户端请求 其实不论客户端进程和服务器进程是采用哪种方式进行通信,最后实现的效果都是:客户端进程向服务器进程发送一段文本(MySQL语句),服务器进程处理 ...
- mysql字符集和表字符集_设置数据库的字符集和设置表字段字符集的区别是什么?...
对于oracle来说,只有数据库字符集这个说法,不存在什么表字符集和字段字符集.你说的这个是mysql的字符集,数据库字符集可以和表字符集不同,也可以和列字符集不同,也就是说,你的数据库字符集为utf ...
- linux 文件 字符集设置,Linux字符集和系统语言设置-LANG,locale,LC_ALL,POSIX等命令及参数详解...
博文说明[前言]: 本文将通过个人口吻介绍Linux字符集和系统语言设置,包括LANG,locale,LC_ALL,POSIX等命令及参数详解的相关知识,在目前时间点[2017年6月21号]下,所掌握 ...
- 使用 _tprintf 宏兼容多字节字符集和Unicode字符集
我们知道在windows平台上写C程序要考虑字符编码问题,为了兼容多字节字符集和Unicode,涉及字符,字符串操作,都要用TEXT宏围起来. 如果要使用printf,但是不确定字符集,可以使用 _t ...
- C++ 中ACSII字符集和Unicode字符集转换
#include "stdio.h" #include "iostream" #include "string" #include &quo ...
- 如何查看linux系统的字符集,Linux系统查看字符集和修改字符集(以CentOS为例)
一.查看字符集 Linux字符集在系统中体现形式是一个环境变量,以CentOS6.5为例,其查看当前终端使用字符集的方式可以有以下四种方式: 第一种: [root@Testa-www tmp]# ec ...
- VS2005 宽字符 unicode字符集和多字节字符集
在vs2005以前版本的vs默认使用多字节字符集,而vs2005默认使用unicode字符集,这会使一些代码不能编译通过 其区别如下 unicode字符集 void Point::output(int ...
最新文章
- springboot中下面哪一个作为jpa默认实现_35个超高频SpringBoot知识点(附解析),别怪我没给你机会收藏...
- 汇编解析(5)-intel的奔4的netburst控制单元技术提高指令处理速度
- Comparable与Comparator用法详解
- AQS理解之七——AQS中的条件队列
- hdu 4349——Xiao Ming's Hope
- 携程赴港二次上市在即 “旅游营销枢纽”战略助价值重估
- Vue学习心得记录之模板语法
- 应用程序架构指导袖珍版
- Preparedstatement和statement 区别
- 中小学计算机中级班教学目标,计算机中级考试教学目标
- Javascript加号的作用、数据类型、输入用户的输入第四课
- mysql 附近3公里的,mysql 查询附近N公里内数据
- 微信小程序系列(3)如何用微信小程序写一个论坛?贴心代码详解(一)发帖
- opencv python 的基本操作案例(一) 记录,可查看
- nginx CDN源站设置与回源host
- python如何提取数据中的年月_Python数据处理笔记——Pandas时间数据提取处理
- 硬件趣学python_硬的解释|硬的意思|汉典“硬”字的基本解释
- 仅仅允许本校报考?多所985/211大学计算机第二学士学位
- 做出刷屏文字的6大哲学
- 【python爬虫实战】批量下载网站视频
热门文章
- 风丘方案助力车企升级 解决“国六”标准新难题
- Kotlin 协程 (5/7篇) - 响应式编程(冷流) Flow
- 想要将自己的胸肌锻炼的更好看,其实是比较不容易的
- cass2008-中小比例尺---查询属性错误---待解决
- winform屏蔽Alt+F4组合键以防止用户关闭对话框
- ftp_mdtm() 函数
- FPGA—IIC 设计
- 【美】柯蒂斯·费思 - 海龟交易法则(2012年12月25日)
- Microchip(微芯)资料下载地址
- 外网访问Openwrt路由器管理Web及SSH