字符集与编码
中文字符集和中文编码 阿四的日志

中文字符集和中文编码阿四的日志中文字符集和中文编码Posted on 八月10, 2011 by ashi 编码(encoding)指的是把某种信息表示成某种形式的过程。
像我们的语言就是一种编码过程,把信息化成文字,声音等语言要素的过程。
这里所谈到的编码是指把语言变成计算机可以识别的信息的过程。
这个过程纷繁复杂,再加上中文字符本身的特点(比英语字符表示上要复杂),发展出来了许多标准,如果没有一个较好的模型(简单说就是一个分层次的概念),很容易把人搞头大。
比如说光看wikipedia上对GB2312,GBK,GB18030,Big5,USC,Unicode,EUC,EUC-CN ,EUC-TW,CP936,CP950,UTF-8,UTF-16,UCS-4,UCS-2等等的名词解释,很难清晰的看到他们之间的关系,也就很难理解这个编码问题。
分层的概念上面说了这个所谓的编码(encoding)是指把语言变成计算机可以识别的信息的过程。
如果把这里的语言简化成所有的中文字,把计算机可以识别的信息简化成2进制数字。
那编码就是找一个把中文字映射成2进制数字的映射的过程。
当然实际上这个过程还是要繁杂一些,下文中我想结合中文编码详细说说我的理解,不当之处见谅。
首先介绍一个分层模型,这个模型在文献Whistler and Davis (2000) 和Dürst et al (2001)中有详细的说明。
原来的模型有5个层次,我觉得取其中的三个层次作介绍就足够我们理解编码了。
这三个层次分别为:一、抽象字符集(Abstract character repertoire ),简称ACR,二、编码后的字符集(Coded character set),简称CCS,二、字符编码形式(Character encoding form),简称CEF。
这个翻译肯定不够恰当,大家尽量以原文的意思去理解它。
ACR是就是指一些字符的集合,里边的字符也没有排序,通俗的说,所有简体中文字符就是一个ACR,所有英文字符也是一个ACR,ACR与GB2312之类的名词之间没有对应,这儿提到只是帮助理解。
字符集简介

一、什么是字符集?什么是编码?字符(Character)是文字与符号的总称,包括文字、图形符号、数学符号等。
一组抽象字符的集合就是字符集(Charset)。
字符集常常和一种具体的语言文字对应起来,该文字中的所有字符或者大部分常用字符就构成了该文字的字符集,比如英文字符集。
一组有共同特征的字符也可以组成字符集,比如繁体汉字字符集、日文汉字字符集。
字符集的子集也是字符集。
计算机要处理各种字符,就需要将字符和二进制内码对应起来,这种对应关系就是字符编码(Encoding)。
制定编码首先要确定字符集,并将字符集内的字符排序,然后和二进制数字对应起来。
根据字符集内字符的多少,会确定用几个字节来编码。
每种编码都限定了一个明确的字符集合,叫做被编码过的字符集(Coded Character Set),这是字符集的另外一个含义。
通常所说的字符集大多是这个含义。
二、有哪些字符集?ASCII:American Standard Code for Information Interchange,美国信息交换标准码。
目前计算机中用得最广泛的字符集及其编码,由美国国家标准局(ANSI)制定。
它已被国际标准化组织(ISO)定为国际标准,称为ISO 646标准。
ASCII字符集由控制字符和图形字符组成。
在计算机的存储单元中,一个ASCII码值占一个字节(8个二进制位),其最高位(b7)用作奇偶校验位。
所谓奇偶校验,是指在代码传送过程中用来检验是否出现错误的一种方法,一般分奇校验和偶校验两种。
奇校验规定:正确的代码一个字节中1的个数必须是奇数,若非奇数,则在最高位b7添1。
偶校验规定:正确的代码一个字节中1的个数必须是偶数,若非偶数,则在最高位b7添1。
ISO 8859-1:ISO 8859,全称ISO/IEC 8859,是国际标准化组织(ISO)及国际电工委员会(IEC)联合制定的一系列8位字符集的标准,现时定义了15个字符集。
字符编码和字符集到底有什么区别?Unicode和UTF-8是什么关系?

字符编码和字符集到底有什么区别?Unicode和UTF-8是什么关系?前⾔想必⼤家编写代码时肯定和我⼀样,也遇到过汉字乱码的问题。
特别是,有时候和上下游对接接⼝,不能统⼀编码格式的话,⼀堆乱码问题,让⼈头⽪发⿇。
那么为什么会有这么多的乱码问题?什么是字符编码?什么是字符集?他们之间有什么区别和联系?什么是 Unicode ? Unicode 和我们常说的 UTF-8 ⼜有什么关系?字符编码和解码要想搞清楚上⾯的问题,⾸先我们要知道,在计算机中,不管是⼀段⽂字、⼀张图⽚还是⼀段视频,最终都是以⼆进制的⽅式来存储。
也就是最终都会转化为0001 1011 0010 0110这样的格式。
换句话说,计算机只认识 0 和 1 这样的数字,并不能直接存储字符。
所以我们需要告诉它什么样的字符对应的是什么数字。
例如,我们的业务中有记录客户端的客户⾏为⽇志,然后导出⽂件来分析,字段间会以ESC来分隔。
我在编写代码的时候,就需要定义⼀下这个ESC字符应该对应什么数字,这样计算机才能识别并存储。
⽐如我把它定为0001 1011,这样计算机就把ESC这个字符存了下来。
等我下次需要查看的时候,根据对应关系把它解出来就可以了。
上边的两个过程就对应字符的编码和解码过程。
字符编码就是把字符按⼀定的规则,转换成数字。
字符解码是编码的逆过程,即把数字按规则转换成字符。
这样看来,貌似没有什么问题。
但是,这是我⾃⼰定义的编码规则,我同桌阿霄就不乐意了。
他⾮要认为ESC应该定义为1101 1000,好家伙正好和我定义的⼆进制数字顺序相反。
那结果肯定不⽤说了,我把0001 1011这串数字给他之后,按照他的编码规则来解,肯定是&$#!这样的东西。
所以,乱码问题说到底,就是编码和解码的规则对应不上导致的。
ASCII 码为了避免我和阿霄因为编码问题打起来,美国国家标准学会(AMERICAN NATIONAL STANDARDS INSTITUTE) ANSI 组织发话了。
数据库字符集编码和表字符集编码

数据库字符集编码和表字符集编码数据库字符集编码和表字符集编码是数据库中非常重要的概念,它们决定了数据库中存储的数据的字符编码方式。
正确设置字符集编码可以确保数据的正确存储和显示,避免出现乱码等问题。
数据库字符集编码是指数据库服务器使用的字符编码方式,它决定了数据库中所有表的默认字符集编码。
常见的数据库字符集编码有UTF-8、GBK、GB2312等。
UTF-8是一种通用的字符编码方式,支持全球范围内的字符,是目前最常用的字符集编码方式。
GBK和GB2312是中文字符集编码方式,适用于中文环境。
表字符集编码是指每个表在数据库中的字符编码方式,它可以与数据库字符集编码不同。
在创建表时,可以指定表的字符集编码,也可以使用数据库的默认字符集编码。
如果表的字符集编码与数据库的字符集编码不一致,那么在存储和显示数据时就需要进行字符集转换,这可能会导致性能下降和数据损坏。
正确设置数据库字符集编码和表字符集编码非常重要。
首先,它可以确保数据的正确存储和显示。
如果数据库字符集编码和表字符集编码不一致,那么在存储和显示数据时就可能出现乱码等问题,影响用户体验。
其次,它可以提高数据库的性能。
如果数据库字符集编码和表字符集编码一致,那么在存储和显示数据时就不需要进行字符集转换,可以提高数据库的性能。
在设置数据库字符集编码和表字符集编码时,需要考虑以下几个因素。
首先,需要考虑数据库的使用环境。
如果数据库主要用于存储中文数据,那么可以选择中文字符集编码,如GBK或GB2312。
如果数据库需要支持全球范围内的字符,那么可以选择UTF-8字符集编码。
其次,需要考虑数据库的性能和存储空间。
不同的字符集编码对存储空间的占用和性能有不同的影响。
一般来说,UTF-8字符集编码占用的存储空间较大,但支持更多的字符,而GBK和GB2312字符集编码占用的存储空间较小,但只支持中文字符。
最后,需要考虑与其他系统的兼容性。
如果数据库需要与其他系统进行数据交换,那么需要确保数据库字符集编码和表字符集编码与其他系统兼容。
字符和汉字编码

字符和汉字编码一、字符集编码字符集编码是指将字符集中的字符转换为计算机可识别的二进制编码。
常见的字符集编码包括ASCII编码、GB2312编码、GBK编码、UTF-8编码等。
1. ASCII编码:ASCII编码是最常用的字符集编码,它包含了128个字符,每个字符用一个字节的二进制数表示。
2. GB2312编码:GB2312编码是中国大陆使用的字符集编码,它包含了6763个汉字和一些其他的字符。
3. GBK编码:GBK编码是中国大陆使用的扩展字符集编码,它包含了20902个汉字和一些其他的字符。
4. UTF-8编码:UTF-8编码是一种可变长度的字符集编码,它包含了几乎所有的语言字符,包括汉字。
二、汉字编码汉字编码是指将汉字转换为计算机可识别的二进制编码。
常见的汉字编码包括GB2312编码、GBK编码、UTF-8编码等。
1. GB2312编码:GB2312编码是中国大陆使用的汉字编码,它包含了6763个汉字。
2. GBK编码:GBK编码是中国大陆使用的扩展汉字编码,它包含了20902个汉字。
3. UTF-8编码:UTF-8编码是一种可变长度的汉字编码,它包含了几乎所有的语言字符,包括汉字。
三、字符和汉字的输入方法字符和汉字的输入方法包括键盘输入、手写输入、语音输入等。
1. 键盘输入:通过键盘输入字符和汉字,是最常用的输入方法。
2. 手写输入:通过手写输入汉字,通常需要使用专门的识别软件。
3. 语音输入:通过语音输入汉字,通常需要使用语音识别软件。
四、字体和字形的表示字体和字形的表示包括矢量字体和点阵字体。
矢量字体是一种数学描述的字体,可以无损放大;点阵字体是一种像素点的集合,放大后会出现失真。
五、编码标准编码标准是指制定字符集编码和汉字编码的规范和标准。
中国制定了《信息交换用汉字编码字符集》等标准,国际上制定了ISO/IEC 10646等标准。
六、字符和汉字的输出方法字符和汉字的输出方法包括屏幕输出、打印机输出、文件输出等。
C语言中的字符串与字符集详解

C语⾔中的字符串与字符集详解字符集理论及应⽤详解⼀、字符集和字符编码1、定义字符集(Character Set/Charset)是⼀个系统⽀持的所有抽象字符的集合。
字符是各种⽂字和符号的总称,包括各国家⽂字、标点符号、图形符号、数字等。
简单来说,字符集就是⼀个表。
这个表有两列,⼀列是各种字符,另⼀列是每个字符锁对应的编号。
注意,字符集只是⼀个规则,或者说是标准。
它只定义每个字符对应的编对应关系,⽽不存储每个字符的图像。
存储字符图像的是字体⽂件。
可以这样理解:字码,建⽴字符和数字的对应关系体⽂件中存了很多张图⽚,每⼀张图⽚都是⼀个字符的样⼦,同时每个图⽚都有⾃⼰的名字(可能不⽌⼀个),这个名字就是图⽚中的字符在字符集中的编码。
图⽚可以看作是字体⽂件中的⼀个字符,名字可以看作是其对应的编码(这⾥是Unicode字符集指定的编码)字符编码(Character Encoding)是⼀套法则,使⽤该法则能够对⾃然语⾔的字符的⼀个集合(如字母表或⾳节表),与其他东西的⼀个集合(如号码或电脉冲)进⾏配对。
即在符号集合与数字系统之间建⽴对应关系,它是信息处理的⼀项基本技术。
通常⼈们⽤符号集合(⼀般情况下就是⽂字)来表达信息。
⽽以计算机为基础的信息处理系统则是利⽤元件(硬件)不同状态的组合来存储和处理信息的。
元件不同状态的组合能代表数字系统的数字,因此字符编码就是将符号转换为计算机可以接受的数字系统的数,称为数字代码。
简单来说,字符编码就是表⽰字符的⽅法。
例如,如何将字符集中字符⾃⼰的编号存在计算机中。
2、常见字符集常见字符集有两⼤类,分别是ANSI和Unicode。
其中ANSI⼜包含了很多具体的字符集,例如GB2312,BIG5,Shift-JIS等。
ANSI字符集:ANSI编码包含了⼀系列字符集,所以准确来讲,它并不能被叫做⼀个字符集。
但是由于技术原因(下⾯会讲),这⼀系列字符集同时只能使⽤⼀个,所以把整个ANSI编码称作ANSI字符集来讨论也没有什么⼤问题。
字符串知识点总结

字符串知识点总结一、字符串的基本概念1.1 定义:字符串是由零个或多个字符组成的有序序列,可以使用单引号、双引号或三引号来表示。
例如:'hello'、"world"、'''welcome to the world'''。
1.2 字符集和编码:字符串中的字符由字符集组成,而字符集又按照特定的规则进行编码。
常见的字符集有ASCII、Unicode、UTF-8等,而编码方式有UTF-8、UTF-16、GBK等。
在不同的编码方式下,同一个字符所占的字节数是不同的。
1.3 不可变性:字符串是不可变的数据类型,一旦创建之后就不能修改。
如果需要修改原有的字符串,那么就需要创建一个新的字符串。
1.4 转义字符:在字符串中,通过使用反斜杠(\)加上特定的字符可以表示一些特殊的字符,如换行符(\n)、制表符(\t)、回车符(\r)等。
1.5 字符串的长度:通过len()函数可以获取字符串的长度,即字符串中字符的个数。
例如,len('hello')的结果是5。
二、字符串的常见操作2.1 字符串的拼接:可以使用加号(+)来将两个字符串连接起来,也可以使用join()方法来拼接多个字符串。
2.2 字符串的切片:可以使用索引和切片操作来获取字符串中的子串。
例如,s[1:3]表示从索引1到索引3之间的子串。
2.3 字符串的重复:可以使用乘号(*)来实现字符串的重复。
例如,'hello' * 3的结果是'hellohellohello'。
2.4 字符串的查找:可以使用in关键字或者find()、index()方法来查找字符串中是否包含某个子串。
2.5 字符串的替换:可以使用replace()方法来替换字符串中的指定子串。
2.6 字符串的分割:可以使用split()方法将字符串按照指定的分隔符进行分割。
字符集和字符编码(CharsetEncoding)

字符集和字符编码(CharsetEncoding)——每个软件开发⼈员应该⽆条件掌握的知识!——Unicode伟⼤的创想!相信⼤家⼀定碰到过,打开某个⽹页,却显⽰⼀堆像乱码,如"бЇЯАзЪСЯ"、"�????????"?还记得HTTP中的Accept-Charset、Accept-Encoding、Accept-Language、Content-Encoding、Content-Language等消息头字段?这些就是接下来我们要探讨的。
⽬录:1.*础知识计算机中储存的信息都是⽤⼆进制数表⽰的;⽽我们在屏幕上看到的英⽂、汉字等字符是⼆进制数转换之后的结果。
通俗的说,按照何种规则将字符存储在计算机中,如'a'⽤什么表⽰,称为"编码";反之,将存储在计算机中的⼆进制数解析显⽰出来,称为"解码",如同密码学中的加密和解密。
在解码过程中,如果使⽤了错误的解码规则,则导致'a'解析成'b'或者乱码。
字符集(Charset):是⼀个系统⽀持的所有抽象字符的集合。
字符是各种⽂字和符号的总称,包括各国家⽂字、标点符号、图形符号、数字等。
字符编码(Character Encoding):是⼀套法则,使⽤该法则能够对⾃然语⾔的字符的⼀个集合(如字母表或⾳节表),与其他东西的⼀个集合(如号码或电脉冲)进⾏配对。
即在符号集合与数字系统之间建⽴对应关系,它是信息处理的⼀项*本技术。
通常⼈们⽤符号集合(⼀般情况下就是⽂字)来表达信息。
⽽以计算机为*础的信息处理系统则是利⽤元件(硬件)不同状态的组合来存储和处理信息的。
元件不同状态的组合能代表数字系统的数字,因此字符编码就是将符号转换为计算机可以接受的数字系统的数,称为数字代码。
2.常⽤字符集和字符编码常见字符集名称:ASCII字符集、GB2312字符集、BIG5字符集、GB18030字符集、Unicode字符集等。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
字符集与编码
一.字符集与编码之间的关系
1.为了在计算机中存储与处理,必须对字符进行数字化编码。
2.字符集规定了包含哪些字符,每个字符的值是什么
3.编码规定了对于这些值,如何存储
4.有些标准同时规定了字符集及其编码
如:目前使用最广泛的西文字符集及其编码是ASCII 字符集和ASCII码(ASCII是American Standard Code for Information Interchange的缩写),它同时也被国际标准化组织(International Organization for Standardization, ISO)批准为国际标准
5.有些标准同一个字符集可以有多种编码格式
二.字符集及编码
1.SBCS (single byte character set)
1.1 ASCII
(1).7位编码,范围0x00-0x7F
(2).码值32-127(0x20-0x7F)
(3).0x00-0x1F 之间的为控制字符,每个字符有一个缩写的名字
(4).数字,大写字母,小写字母的编码都是连续的
目前使用最广泛的西文字符集及其编码是 ASCII 字符集和 ASCII 码( ASCII 是American Standard Code for Information Interchange 的缩写),它同时也被国际标准化组织( International Organization for Standardization, ISO )批准为国际标准。
基本的 ASCII 字符集共有 128 个字符,其中有 96 个可打印字符,包括常用的字母、数字、标点符号等,另外还有 32 个控制字符。
标准 ASCII 码使用 7 个二进位对字符进行编码,对应的 ISO 标准为 ISO646 标准。
下表展示了基本 ASCII 字符集及其编码:
字母和数字的 ASCII 码的记忆是非常简单的。
我们只要记住了一个字母或数字的ASCII 码(例如记住 A 为 65 , 0 的 ASCII 码为 48 ),知道相应的大小写字母之间差 32 ,就可以推算出其余字母、数字的 ASCII 码。
虽然标准 ASCII 码是 7 位编码,但由于计算机基本处理单位为字节( 1byte = 8bit ),所以一般仍以一个字节来存放一个 ASCII 字符。
每一个字节中多余出来的一位(最高位)在计算机内部通常保持为 0 (在数据传输时可用作奇偶校验位)。
由于标准 ASCII 字符集字符数目有限,在实际应用中往往无法满足要求。
为此,国际标准化组织又制定了 ISO2022 标准,它规定了在保持与 ISO646 兼容的前提下将ASCII 字符集扩充为 8 位代码的统一方法。
ISO 陆续制定了一批适用于不同地区的扩充 ASCII 字符集,每种扩充 ASCII 字符集分别可以扩充 128 个字符,这些扩充字符
的编码均为高位为 1 的 8 位代码(即十进制数 128~255 ),称为扩展 ASCII 码。
1.2 EBCDID
广义二进制编码的十进制交换码(EBCDIC,Extended Binary Coded Decimal Interchange Code)(读作"ehb-suh-dik"或"ehb-kuh-dik"),是字母或数字字符的二进制编码,它是IBM为更大型的操作系统开发的。
EBCDIC是用于IBM S/390服务器上的IBMOS/390操作系统的文本文件的编码。
在一个EBCDIC文件中,每个字母或数字字符都用一个8位的二进制数来表示(八个由0和1组成的字符串)。
共有256个可能的字符(字母、数字和一些特殊字符)。
IBM的个人电脑和工作站操作系统不使用IBM所有的EBCDIC编码。
相反的,它们使用文本的工业标准编码,ASCII码。
转化程序允许不同的操作系统将文件从一种编码转化成另一种编码。
1.3 ISO8859-x
(1)x=1~15,是一系列标准,对应13种不同的语言
(2)ISO-8859-x 是单字节编码,8位编码
(3)0x00-0x7F部分跟ASCII兼容
(4)0x80及以上部分部分除了少数字符,用来编码相应的语言的专有字符,各不相同。
(5)ISO-8859-1 最常见,收集了西欧字符
(6)因为没有一个全集字符集,ISO-8859-X之间不能互相转换。
2.DBCS (double byte character set)
2.1 GB2312
(1)兼容ASCII的部分用单字节编码
(2)汉字部分的编码根据区位码进行,用两字节表示,第一个字节等于区位码的区码+0xA0,第一个字节等于区位码的位码+0xA0,因此每个字节都在0xA0以上
(3)7445个符号,支持6763个简体汉字和682个符号
最常用的称为一级汉字,3755个,按照拼音排序
次常用的称为二级汉字,3008个,按照部首排序
2.2 GBK
(1)规范,没能成为标准,但随着Windows流行很广泛。
(2)与GB2312向下兼容
(3)比GB2312增加了大量的繁体字和异体字
(4)首字节扩展到0x81-0xFE,第二个字节扩展到0x40-0xFE。
23940个码位,包含了21003个汉字
2.3 BIG5
(1) 1984年由中华民国财团法人信息工业策进会为五大中文套装软件(宏碁、神通、佳佳、零壹、大众)所设计的中文内码
(2)主要用于港澳台地区以及另外一些海外华人
(3)收录了13060个中文字
(4)不支持简体字
(4)“高位字节”使用了0x81-0xFE,“低位字节”使用了0x40-0x7E,及0xA1-0xFE
3.MBCS multiple byte character set
UTF-8
ISO18030
总结一下,Unicode字符集规定的标准编码方案是UCS-2(UTF-16),用两个字节表示一个Unicode字符,而事实上,UCS-4 (UTF-32)也已经被提出了,用4个字节表示一个Unicode字符,然后,一个常用的Unicode编码方案—UTF-8,它用1到4(6)位的变长字节来表示一个Unicode字符,并可以从一个简单的转换算法从UTF-16直接得到。
这三个编码方案(Encoding)都对应于Unicode字符集(Charset)。