Unicode、UTF-8 和 ISO8859-1到底有什么区别

说明:本文转载于新浪博客,旨在方便知识总结。原文地址:http://blog.sina.com.cn/s/blog_673c81990100t1lc.html

本文主要包括以下几个方面:编码基本知识,java,系统软件,url,工具软件等。

在下面的描述中,将以"中文"两个字为例,经查表可以知道其GB2312编码是"d6d0 cec4",Unicode编码为"4e2d 6587",UTF编码就是"e4b8ad e69687"。注意,这两个字没有iso8859-1编码,但可以用iso8859-1编码来"表示"。

2. 编码基本知识

最早的编码是iso8859-1,和ascii编码相似。但为了方便表示各种各样的语言,逐渐出现了很多标准编码,重要的有如下几个。

2.1. iso8859-1

属于单字节编码,最多能表示的字符范围是0-255,应用于英文系列。比如,字母a的编码为0x61=97。

很明显,iso8859-1编码表示的字符范围很窄,无法表示中文字符。但是,由于是单字节编码,和计算机最基础的表示单位一致,所以很多时候,仍旧使用iso8859-1编码来表示。而且在很多协议上,默认使用该编码。比如,虽然"中文"两个字不存在iso8859-1编码,以gb2312编码为例,应该是"d6d0 cec4"两个字符,使用iso8859-1编码的时候则将它拆开为4个字节来表示:"d6 d0 ce c4"(事实上,在进行存储的时候,也是以字节为单位处理的)。而如果是UTF编码,则是6个字节"e4 b8 ad e6 96 87"。很明显,这种表示方法还需要以另一种编码为基础。

2.2. GB2312/GBK

这就是汉子的国标码,专门用来表示汉字,是双字节编码,而英文字母和iso8859-1一致(兼容iso8859-1编码)。其中gbk编码能够用来同时表示繁体字和简体字,而gb2312只能表示简体字,gbk是兼容gb2312编码的。

2.3. unicode

这是最统一的编码,可以用来表示所有语言的字符,而且是定长双字节(也有四字节的)编码,包括英文字母在内。所以可以说它是不兼容iso8859-1编码的,也不兼容任何编码。不过,相对于iso8859-1编码来说,uniocode编码只是在前面增加了一个0字节,比如字母a为"00 61"。

需要说明的是,定长编码便于计算机处理(注意GB2312/GBK不是定长编码),而unicode又可以用来表示所有字符,所以在很多软件内部是使用unicode编码来处理的,比如java。

2.4. UTF

考虑到unicode编码不兼容iso8859-1编码,而且容易占用更多的空间:因为对于英文字母,unicode也需要两个字节来表示。所以unicode不便于传输和存储。因此而产生了utf编码,utf编码兼容iso8859-1编码,同时也可以用来表示所有语言的字符,不过,utf编码是不定长编码,每一个字符的长度从1-6个字节不等。另外,utf编码自带简单的校验功能。一般来讲,英文字母都是用一个字节表示,而汉字使用三个字节。

注意,虽然说utf是为了使用更少的空间而使用的,但那只是相对于unicode编码来说,如果已经知道是汉字,则使用GB2312/GBK无疑是最节省的。不过另一方面,值得说明的是,虽然utf编码对汉字使用3个字节,但即使对于汉字网页,utf编码也会比unicode编码节省,因为网页中包含了很多的英文字符。

3. java对字符的处理

在java应用软件中,会有多处涉及到字符集编码,有些地方需要进行正确的设置,有些地方需要进行一定程度的处理。

3.1. getBytes(charset)

这是java字符串处理的一个标准函数,其作用是将字符串所表示的字符按照charset编码,并以字节方式表示。注意字符串在java内存中总是按unicode编码存储的。比如"中文",正常情况下(即没有错误的时候)存储为"4e2d 6587",如果charset为"gbk",则被编码为"d6d0 cec4",然后返回字节"d6 d0 ce c4"。如果charset为"utf8"则最后是"e4 b8 ad e6 96 87"。如果是"iso8859-1",则由于无法编码,最后返回 "3f 3f"(两个问号)。

3.2. new String(charset)

这是java字符串处理的另一个标准函数,和上一个函数的作用相反,将字节数组按照charset编码进行组合识别,最后转换为unicode存储。参考上述getBytes的例子,"gbk" 和"utf8"都可以得出正确的结果"4e2d 6587",但iso8859-1最后变成了"003f 003f"(两个问号)。

因为utf8可以用来表示/编码所有字符,所以new String( str.getBytes( "utf8" ), "utf8" ) === str,即完全可逆。

3.3. setCharacterEncoding()

该函数用来设置http请求或者相应的编码。

对于request,是指提交内容的编码,指定后可以通过getParameter()则直接获得正确的字符串,如果不指定,则默认使用iso8859-1编码,需要进一步处理。参见下述"表单输入"。值得注意的是在执行setCharacterEncoding()之前,不能执行任何getParameter()。java doc上说明:This method must be called prior to reading request parameters or reading input using getReader()。而且,该指定只对POST方法有效,对GET方法无效。分析原因,应该是在执行第一个getParameter()的时候,java将会按照编码分析所有的提交内容,而后续的getParameter()不再进行分析,所以setCharacterEncoding()无效。而对于GET方法提交表单是,提交的内容在URL中,一开始就已经按照编码分析所有的提交内容,setCharacterEncoding()自然就无效。

对于response,则是指定输出内容的编码,同时,该设置会传递给浏览器,告诉浏览器输出内容所采用的编码。

说明:本文转载于新浪博客,原文地址:http://blog.sina.com.cn/s/blog_673c81990100t1lc.html

时间: 2024-10-24 06:06:50

Unicode、UTF-8 和 ISO8859-1到底有什么区别的相关文章

[科普] 4G和3G到底有什么区别?

在开发多线程的程序的时候接触了.NET里面的自旋.这个自旋可以将线程暂停指定的时间,而使用Sleep的话,则是让线程执行无意义的内耗循环. 如下图: Threading.Thread.Sleep 1000 ------------[开始Sleep]---CPU在该线程上循环执行空指令,并且检查时间是否达到延时设定---------------[时间到达,接触延时,继续执行程序]--------------- 这个整个过程,CPU资源都在都在执行本程序. Threading.SpinWait.Sp

Union和Union All到底有什么区别

以前一直不知道Union和Union All到底有什么区别,今天来好好的研究一下,网上查到的结果是下面这个样子,可是还是不是很理解,下面将自己亲自验证: Union:对两个结果集进行并集操作,不包括重复行,同时进行默认规则的排序: Union All:对两个结果集进行并集操作,包括重复行,不进行排序: 下面进行简单的测试(因为是测试,所以sql代码写的很简单,没有什么很严格的规范,只是为了理解这两者之间的区别) 严格的标准写法应该先判断数据库是否存在,表是否存在等等约束 第一步,建库: view

print、print_r、echo到底有什么区别?

echo和print都可以做输出,不同的是,echo不是函数,没有返回值,而print是一个函数有返回值,所以相对而言如果只是输出 echo 会更快,而print_r通常用于打印变量的相关信息,通常在调试中使用.echo 不是函数,没有返回值print 是打印字符串print_r 则是打印复合类型 如数组 对象print.print_r.echo到底有什么区别?

来说一说chrome扩展和chrome插件到底有什么区别?

想讨论chrome扩展和chrome插件区别这个话题很久了!但是迟迟没有写.因为我自己也没有搞清楚这两者之间的区别!回想当初是因为需要寻找番羽墙插件才想到去搜索到chrome插件. 想讨论chrome扩展和chrome插件区别这个话题很久了!但是迟迟没有写.因为我自己也没有搞清楚这两者之间的区别!回想当初是因为需要寻找番羽墙插件才想到去维护一个类似的插件网.我甚至问过身边很多程序员这两者之间的区别,说实话能说清楚的也没有几个.今日在论坛里看到有热心的网友推荐这个chrome网,甚是欣慰.但是看到

minSdkVersion、targetSdkVersion、maxSdkVersion、target API level四个数值到底有什么区别

在AndroidMenifest.xml中,常常会有下面的语句: <uses-sdk android:minSdkVersion="4" android:targetSdkVersion="10" android:maxSdkVersion="10" /> 在default.properties中,会看到下面的语句: target=android-10 如果是使用Eclipse的话,还可能会看到这样的警告:Attribute minS

4G和3G到底有什么区别

同学的同学提出一个疑问:"4G和3G到底有什么区别?"我们整个宿舍哑口无言,唯一的回答是:"速度快--"(废话,速度快,这还用你说?!) 这是件多么令人惭愧的事啊,当非专业同学兴致勃勃地向我们请教一些专业问题时,许多情况下都得不到像样的回答,最终被"我们不学这个"搪塞过去.这些还都不是什么高深的问题,仅仅处于用户应用和体验层面. 于是我有了这样的念头,要把这些当初没有回答出来的问题好好回答一下,并且尽量用非专业的通俗语言.观众不在多少,至少是自己

England,Britain和UK到底有什么区别

最佳答案 UK: 联合王国,范围最大,英国全称.包括大不列颠及北爱尔兰群岛. Britain: 不列颠. Great Britain: 大不列颠,包括England英格兰,Scotland苏格兰,及Wales威尔士. England: 英格兰. 类似中国,中国大陆,香港,澳门,台湾之间的故事. 其他回答 England: 广义指英国,狭义指英格兰. Great Britain: 大不列颠,包括英格兰,威尔士及苏格兰. The UK(The United Kingdom缩写)大不列颠及爱尔兰联合王

服务监听在127.0.0.1和0.0.0.0上,到底有什么区别呢?

服务监听在127.0.0.1和0.0.0.0上,到底有什么区别呢?给个实际的例子,大家看看 今天发现在nb1380的mysql从nb1381连不上? 1.使用grant加权限,失败 mysql> select user,host,password from mysql.user; 11 rows in set (0.00 sec) mysql> grant all privileges on *.* to 'root'@'nb1381' identified by '  ' with gran

MVC和MVP到底有什么区别呢?

MVC和MVP到底有什么区别呢? MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写 MVP 全称:Model-View-Presenter :MVP 是从经典的模式MVC演变而来,它们的基本思想有相通的地方:Controller/Presenter负责逻辑的处理,Model提供数据,View负责显示. 而MVP则是对MVC的进一步改造,以Andorid为例,实际上在MVC中很难区分Activity到底应该处于V还