`
yimi128
  • 浏览: 56126 次
  • 来自: ...
社区版块
存档分类
最新评论

编码与字符集

阅读更多

ASCII

计算机内部,所有信息最终都表示为一个二进制的字符串。每个二进制位有01两种状态,因为8个二进制位可以组合出256中状态,称为一个字节(byte)。也就是说,一个字节一共可以用来表示256中不同的状态,每个状态对应一个符号,就是256个符号,从0000000011111111

 

上世界60年代,美国制订了一套字符编码,对英语字符与二进制位之间的关系,做了一个规定,称为ASCII码,一共规定了128个字符的编码,这128个符号,包括32个不能打印出来的控制符号,只占用了一个字节的后面7位,最前面的一位统一规定为0

 

ASCII编码

英语用128个符号编码就够了,但是其他语言,128个符号不够。一些欧洲国家使用了8位中为0的最高位,可以表示256个字符,但是,新的问题出现了,不同国家的字母不一样,比如130在法语编码中代表一个字母,而在希伯来语编码中代表了另外一个字母,在俄语编码中又代表另外一个符号,虽然大家都是用的256个符号的编码方式,但是不同的编号代表不同的字母。但是不管怎样,所有这些编码方式中,0-127表示的符号都是一样的,即是原来的ASCII码,不同的是128-255这一段。

 

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

 

Unicode

世界上存在着多种编码方式,同一个二进制数字在不同的编码方式下,可以解释成不同的符号。因为,要打开一个文本文件,就必须知道他的编码方式,否则用错误的编码方式解读,就会出现乱码。

 

这时候Unicode出现了,他把世界上所有的符号都纳入其中,每个符号都给予了一个独一无二的编码,只要使用Unicode编写文件,用Unicode解读,就能完全消除乱码问题。

 

Unicode是一个很大的集合,现在的规模可以容纳100多万个符号。每个符号有独一无二的编码,比如,U+0639表示阿拉伯字母AinU+0041表示英语的大写字母AU+4E25表示汉字“严”。

 

Unicode的问题

需要注意的是,Unicode只是一个符号集,它只规定了符号的二进制代码,却没有规定这个二进制代码应该如何存储。

 

像汉字编码等等这些非ASCII编码,不仅规定了哪个二进制数字对应哪个符号,而且明确了二进制数字如何存储,比如欧洲国家的256个符号,用一个字节存储。中文的简体中文编码如GB2312,用2个字节存储,可以最大表示65536个符号。而下面说的Unicode只是一个符号集,并不是编码,Unicode只是规定了哪个二进制数对应哪个符号,但是并没有规定这个二进制数如何存储。

 

比如汉字“严”的unicode二进制代码是4E25,转换成二进制数有15位,也就是说这个符号至少需要2个字节才能表示,其他更大的字符,可能需要3个或者4个字节来存储。

 

这就有问题,第一,如何区别unicodeascii?计算机如何知道三个字节表示一个符号还是分别表示三个符号?第二,因为字母用一个字节就够了,如果unicode统一规定,每个符号用三个或四个字节表示,那么每个英文字母前面必然有两到三个字节是0,对于存储来说是极大的浪费。

 

所以造成如下结果:第一,出现了unicode的多种存储方式,也就是说许多种不同的二进制格式,可以用来表示unicode。第二,unicode在很长一段时间内无法推广,知道互联网出现。

 

UTF-8

互联网的普及,强烈要求出现一种统一的编码方式。UTF-8就是互联网上使用最广的一种unicode实现方式。其他实现方式还有UTF-16UTF-32,基本上不用。重复一遍,UTF-8只是Unicode的实现方式之一。

 

UTF-8最大的一个特点,就是他是一种编程的编码方式,它使用1-4个字节表示一个符号,规则如下:

1,  对于单字节的符号,字节的第一位设置为0,后面7为为这个符号的unicode码,因此对于英语字母,UTF-8编码和ASCII是相同的

2,  对于nn>1)字节的符号,第一个字节的前n位都设置为1,第n+1位设置为0,后面字节的前2位一律设置为10。剩下的没有提及的二进制位,全部为这个符号的unicode码。

编码规则如下:

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编码。

已知unicode4E25100111000100101),根据上表,可以发现4E25处在第三行的范围内(0000 0800-0000 FFFF),因此UTF-8编码需要三个字节,即格式是“1110xxxx 10xxxxxx 10xxxxxx”。然后,从的最后一个二进制位开始,依次从后向前填入格式中的x,多出的位补0。这样就得到了,UTF-8编码是“11100100 10111000 10100101”,转换成十六进制就是E4B8A5

 

 

ASCII GB2312 GBK GB18030的编码方法时向下兼容的。同一个字在这些方案中的编码总是相同的。越往后的标准,支持越多的字符而已。

 

Unicode只是向下兼容ASCII,更准确的说是ISO-8859-1,与GB码不兼容。例如“汉”的Unicode编码是6c49,而GB码是baba

分享到:
评论

相关推荐

    字符集与字符集编码简介

    字符集与字符集编码简介 我们知道,计算机只能识别诸如0101这样的二进制数,于是人们必须以二进制数据与计算机进行交互,或者先将人类使用的字符按一定规则转换为二进制数。 那什么是字符呢?在计算机领域,我们把...

    字符编码和字符集研究

    字符编码则是字符集与二进制数字之间的映射关系,它是计算机存储和处理字符的方式。通过字符编码,每个字符都可以被转化为一系列的二进制位,以便计算机能够识别和操作。编码过程需要先对字符集内的字符进行排序,...

    gb18030中文编码字符集

    GB18030-2005 信息技术 中文编码字符集,单双四字节所有字符,包含简繁生僻字。

    深入理解字符编码(字符集 字符编码 字符显示 乱码问题)

    文档中主要介绍了各类字符集以及相关的字符编码,字符的显示原理,从输入到显现的整个过程,程序中出现的乱码问题以及解决方案

    GB 2312-1980 信息交换用汉字编码字符集 基本集.rar

    ### GB 2312-1980 信息交换用汉字编码字符集 基本集 #### 一、GB 2312-1980简介 GB 2312-1980是中华人民共和国国家技术监督局于1980年发布的信息交换用汉字编码字符集的基本集,它是中国最早的一套国家标准汉字...

    Mysql字符集编码详解

    Mysql字符集编码详解 Mysql数据库中的字符集编码问题是许多开发者经常遇到的一个问题,特别是在JAVA项目中。解决这个问题需要从多方面入手,包括服务器、数据库、数据表和连接等四个层次。这篇文章将详细介绍如何...

    常用字符集及字符编码简介

    GB2312是中国大陆的国家标准字符集,全称为“信息交换用汉字编码字符集·基本集”。它包含6763个汉字以及一些符号,主要用于简体中文的处理。GB2312使用两个字节来表示一个字符,能够满足早期中文信息处理的基本...

    系统如何从字符集显示字体

    #### 一、字符编码与字符集 - **字符编码**:如给定文件中的“D7 D6 B7 FB BA CD B1 E0 C2 EB”等十六进制数字,这实际上代表了一种特定的字符编码方式,用于表示某些特定字符。 - **字符集**:字符集是指一系列...

    字符集和字符编码详解

    字符集和字符编码是计算机处理文字的基础,它们决定了如何在二进制的世界中表示和传输人类语言。本文将深入探讨这两个概念,以及相关的知识点。 首先,我们要理解什么是字符集。字符集,顾名思义,就是一个集合,...

    字符集和字符编码

    GB2312 是中国大陆规定的字符集和编码,取消了 EASCII 的扩展字符,规定一个小于 127 的字符的意义与原来相同,但两个大于 127 的字符连在一起时,就表示一个汉字。GB2312 编码使用两个字节表示一个汉字,前面的一个...

    字符集编码查询/反查工具

    字符集编码是计算机科学中的一个重要概念,涉及到数据的存储、传输和显示。在这个"字符集编码查询/反查工具"中,我们可以看到涉及到的关键技术包括字符集、二进制、十六进制、Base64以及URL编码。这些知识点在信息...

    Java中的字符集编码入门(二)编码字符集与字符集编码的区别[参考].pdf

    本文主要探讨了编码字符集和字符集编码的区别,这对于软件开发人员来说是基础且必要的知识。 首先,我们要区分两个概念:编码字符集和字符集编码。编码字符集,如UCS(Universal Character Set)或Unicode,是一个...

    java字符集编码问题

    本文旨在深入探讨与Java相关的字符集编码知识,包括但不限于编码的基本概念、几种常见的字符集编码类型及其特点,以及Java如何处理这些字符集编码问题。 #### 二、编码基本知识 1. **ISO 8859-1** ISO 8859-1是...

    韩文、日文、繁体字的字符集,及字符集介绍

    在计算机科学领域,字符集(Character Set)是用于表示文本的一组符号集合,它定义了可以被编码的字符范围和编码方式。字符集对于不同语言的处理至关重要,尤其是在存储、显示和传输文本时。本篇文章将详细介绍韩文...

    各国字符集-http编码

    ### 各国字符集与HTTP编码详解 #### 字符集识别与HTTP编码基础 在互联网技术中,字符集(Character Set)是指一组符号及其对应的二进制编码方式,用于计算机系统内部表示、存储和传输文本信息。不同国家和地区使用...

    维吾尔文字符集unicode编码表

    ### 维吾尔文字符集Unicode编码表 #### 概述 本文档提供了一份详细的现代维吾尔文字符集的Unicode编码表。这份表格对于理解、处理和展示维吾尔语文字具有重要意义。通过这份表格,我们可以清晰地看到每一个维吾尔文...

    qt实现转换文件字符集编码

    在IT领域,字符集编码是处理文本数据时一个至关重要的概念。不同的编码方式决定了如何将字符映射到二进制表示,以及如何从二进制还原出字符。Qt是一个跨平台的应用程序开发框架,它提供了丰富的API来处理各种编码...

    Java字符集和编码

    ### Java字符集和编码 #### 一、引言 在探讨Java字符集和编码之前,我们先了解一下为什么在Java编程中需要关注字符集和编码。Java作为一种广泛应用的编程语言,其内部采用的是Unicode编码,这使得Java能够很好地...

    DB2 GBK 字符集解决方案.zip

    - 在导入包含GBK字符的数据时,需确保数据源的编码与DB2的GBK字符集匹配,否则可能产生乱码。使用`LOAD`或`IMPORT`命令时,需要设置正确的字符集选项。 - 导出数据时,同样要注意设置合适的字符集,以保证导出文件...

Global site tag (gtag.js) - Google Analytics