字符的编码与解码

在浏览网页,编写程序时,偶尔会碰到一些乱码问题。例如在打开一个网页时,没有一个正常字符可辨识的,全是一些奇怪的符号,方块、问号等等。通过浏览器的tools->encoding选择UTF-8或者GBK,显示就正常了。为什么会乱码,UTF-8和GBK又是什么东西呢?

汉子,字母等字符,我们可以识别,并理解它们的表达信息。但计算机不能直接识别这些字符,它只能理解二进制信息。为了让计算机能够处理,表示字符,我们需要将字符转换成二进制表达,交给计算机处理。再将计算机处理输出的二进制信息转换成字符。所以这里需要一种字符与二进制的一对一映射关系。在计算机发展早期,用英文字符基本可以搞定一切,所以ASCII用32-127数值可以表示所有的字母和符号,小于32的数值表示非打印的控制字符。如下所示:

ASCII编码

随着计算机的普及,世界各国都在使用。他们的字符也需要用计算机来存储和表示,我们中文也一样。为了能够表达所有的字符,unicode产生了,并成为了标准。unicode涵盖世界上所有字符到代码值(code point)的映射[2],如“A”的映射为U+0041,“中”的映射为U+2D2E。

虽然unicode定义了字符到代码值的映射,但它并没有规定计算机如何来存储这个代码值。于是就有了UTF-16的产生,UTF-16直接将代码值中数值作为字符的二进制表示,这样每个字符基本都占用两个字节,如“中”,用“\x2D\x4E”表示了。这么一弄,美国人不干了,他们原本一个字符只要一个字节表示就可以,现在需要两个字节,所需存储资源无故多了一倍。所以他们大部分还是继续使用ASCII,UTF-16表示很尴尬。为了解决这个问题,聪明的 UTF-8出现了,它能够使英文字符的编码与ASCII保持一致,而其它的字符则可能用更多字节表示。这样就不用增加美国人的内存消耗,不过其他国家可能要多牺牲一点内存了。

UTF-8的编码格式

这样中文的每个字符也无故多用了一个字节,嗯,想想有点浪费。所以我们也有了自己的编码格式,如GBK,英文字母的编码格式与ASCII保持一致,中文字符采用两字节表示,其它国家的字符就管不了那么多了。不过其它国家基本也都有自己的编码格式。

如下所示,GBK、Big5、UTF-8、UTF-16四种编码协议定义“中”字的在计算机中的二进制表达为:

   GBK      Big5        UTF-8     UTF-16
\xD6\xD0  \xA4\xA4  \xE4\xB8\xAD  \x2D\x4E

所以如果我使用GBK将“中”编码为“\xD6\xD0”,并存放文件file.txt中,然后发给你。如果你使用UTF-8对该文件进行解码,会发现该文件显示"?",换成GBK解码,就正常了。

简单点说:unicode规定字符到代码值的映射,代码值虽不直接存放于计算机上,但大家都必须认可某一代码值只能表示某一字符,所以可以认为代码值是字符在计算机层一个抽象。UTF-8、GBK等编码协议规定计算机怎样来存储代码值。如:是用几个字节来存储代码值呢,这些字节怎样来表示这个代码值呢?

参考文献

[1] http://www.joelonsoftware.com/articles/Unicode.html

[2] http://www.unicode.org/

字符的编码与解码

时间: 2024-10-07 16:46:09

字符的编码与解码的相关文章

使用 URLDecoder 和 URLEncoder 对中文字符进行编码和解码

摘要: URLDecoder 和 URLEncoder 用于完成普通字符串 和 application/x-www-form-urlencoded MIME 字符串之间的相互转换.在本文中,我们以使用URLDecoder解决GET请求中文乱码问题为场景说明 URLDecoder/URLEncoder 的用法,并给出了 application/x-www-form-urlencoded MIME 字符串的编码规则. 一. URLDecoder/URLEncoder 使用场景概述 URLDecode

Python中字符的编码与解码

1 文本和字节序列 我们都知道字符串,就是由一些字符组成的序列构成串,那么字符又是什么呢?计算机只能识别二进制的东西,那么计算机又为什么会显示我们的汉字,或者是某个字母呢? 由于最早发明使用计算机是美国人,他们为了解决了英语如何在电脑上显示,就制定了一套标准:ASCII ((American Standard Code for Information Interchange): 美国信息交换标准代码),主要用于显示现代英语和其他西欧语言.到目前为止共定义了128个字符,从0-127的二进制数分别

Java 字符编码与解码

1.字符编码的发展历程 ①.ASCII 码 因为计算机只认识数字,所以我们在计算机里面的一切数据都是以数字来表示,因为英文字符有限,所以规定使用的字节的最高位是 0,每一个字节都是以 0-127 之间的数字来表示.比如 A 对应 65,a 对应 97.这便是 美国标准信息交换码,ASCII String str = new String("Aa"); byte[] strASCII = str.getBytes("ASCII"); System.out.printl

了解URL编码的基本概念,在javascript和java程序中使用内置的API进行编码和解码

1.URL编码的基本概念 URL只能使用US-ASCII 字符集来通过因特网进行发送.由于URL常常会包含 ASCII 集合之外的字符,URL必须转换为有效的 ASCII 格式.URL 编码使用 "%" 其后跟随两位的十六进制数来替换非 ASCII 字符.URL 不能包含空格,URL 编码通常使用 + 来替换空格.所谓URL编码,就是将非US-ASCII字符和US-ASCII中的特殊字符,用相应的字符集编码来表示.比如,汉字"你",如果用UTF-8编码,出现在URL

python第三天学习复习,集合set,文件操作,函数(普通函数,递归,高阶函数),字符编码和解码

三元运算 age = 23 #就是if else的简单写法 a = age if age < 20 else 25 集合 set #集合是无序切不重复的, #当对列表去重复的时候,可以直接使用 set(list),就将list转为set,并去除中间重复的 list = [1,2,3,4,5,5,6,7,8,9,1] s = set(list) 运行结果:可以发现将 list中重复的去掉,并且类型变成set,再使用list(set),转为list 集合操作 # Author:zylong set1

URL编码与解码

通常如果一样东西需要编码,说明这样东西并不适合传输.原因多种多样,如Size过大,包含隐私数据,对于Url来说,之所以要进行编码,是因为Url中有些字符会引起歧义. 例如Url参数字符串中使用key=value键值对这样的形式来传参,键值对之间以&符号分隔,如/s?q=abc&ie=utf-8.如果你的value字符串中包含了=或者&,那么势必会造成接收Url的服务器解析错误,因此必须将引起歧义的&和=符号进行转义,也就是对其进行编码. 又如,Url的编码格式采用的是ASC

Python学习笔记八:文件操作(续),文件编码与解码,函数,递归,函数式编程介绍,高阶函数

文件操作(续) 获得文件句柄位置,f.tell(),从0开始,按字符数计数 f.read(5),读取5个字符 返回文件句柄到某位置,f.seek(0) 文件在编辑过程中改变编码,f.detech() 获取文件编码,f.encoding() 获取文件在内存中的编号,f.fileno() 获取文件终端类型(tty.打印机等),f.isatty() 获取文件名,f.name() 判断文件句柄是否可移动(tty等不可移动),f.seekable() 判断文件是否可读,f.readable() 判断文件是

字符与编码(Java编码转换详细过程)

字符串在java内存中统一用unicode表示( 即utf-16 LE) , 不管是字符串字面量还是从文件中读取的,java使用unicode作为桥梁来处理各种编码的转换. 我们的java程序由.java的类文件组成,在这些类文件中都有可能包含中文字符串.并且我们常常需要和用户直接交互,用于输入和输出字符串.如:我们在jsp和servlet中得到客户端发送过来的字符串,这些字符串中包含中文字符.无论这些java类的作用如何,这些java程序的生命周期都是这样的: 1.编程人员在一定的操作系统上选

[转]各种字符集和编码详解

在软件的编码和实现中,我们可能会碰到个 一个比较头疼的问题--编码,不同字符间的编码和解码,你确定了解各种字符的编码吗?一个朋友问到了我这个问题,我虽然能回答一两个出来,但是感觉已经有点模糊,混乱了,在网上搜了搜,在书上翻了翻,总结一下吧.首先按照字符编码的历程来看: 1.  ASCII 我们需要了解的最早编码是ASCII码.它用7个二进制位来表示,由于那个时期生产的大多数计算机使用8位大小的字节,因此用户不仅可以存放所有可能的ASCII字符,而且有整整一位空余下来.如果你技艺高超,可以将该位用