UTF-8的文件解码为iso8859-1之后为什么会出现乱码? 求高手解答!!

2024-11-17 13:26:03
推荐回答(1个)
回答1:

ISO8859-1,通常叫做Latin-1。Latin-1包括了书写所有西方欧洲语言不可缺少的附加字符。 而gb2312是标准中文字符集。 但是 ISO 10646 码有下列问题: UTF-16 或 Unicode 是 16-bit 固定长度的编码,并没有比 Big5 或 GB2312 码提供更大的容纳空间。而 8-bit 不定长 (variable-length) 的编码,每个中文字使用 3 个位元组 (byte)。 这意味着使用 UTF-8 编码的 XML 文件会比使用 Big5 码的文件大上 50%。但是假如使用 ASCII 码的标示 (Markup),文件就不会大这么多了。 标示大约会占文件的 50%。可能要使文件大小减少的方式就是采用 文件压缩了。 ISO 10646 码中,字的顺序与任何的中文码并不同。无法使用一个 简单的演算法 (algorithm) 就可以将 Big5 或 GB2312 码转换为 ISO 10646。您得用一个转换表来进行转码。但另一方面,ISO 10646 码的中文字序有利于排序 (sorting)。而且也去除了重复字,因而 对于检索 (searching) 也有帮助。(据说 GBK 字集包含 ISO 10646 码中所有的字,而且保留与 GB2312 码相同的字序。在某些情形下 可能是个好字集。)UTF-8 是 UNICODE 的一种变长字符编码,即 RFC 3629。简单的说——大字符集。可以解决多种语言文本显示问题,从而实现应用国际化和本地化。对系统来讲,UTF-8 编码可以通过屏蔽位和移位操作快速读写,排序更加容易。UTF-8 是字节顺序无关的,它的字节顺序在所有系统中都是一样的。 UTF-8是UTF-8编码是一种目前广泛应用于网页的编码,它其实是一种Unicode编码,即致力于把全球所有语言纳入一个统一的编码。前UTF-8已经把几种重要的亚洲语言纳入,包括简繁中文和日韩文字。因此 UTF-8 具有更高的性能。 不过如果是纯英文的话,用什么都可以,用GB2312也没问题。GB2312是简体中文编码,当文章/网页中包含繁体中文、日文、韩文时,这些内容可能无法被正确编码。对于GB2312 汉字是双字节的。所谓双字节是指一个双字要占用两个BYTE的位置(即16位),分别称为高位和低位。 中国规定的汉字编码为GB2312,这是强制性的,目前几乎所有的能处理中文的应用程序都支持GB2312。GB2312包括了一二级汉字和9区符号,高位从0xa1到0xfe,低位也是从0xa1到0xfe,其中,汉字的编码范围为0xb0a1到0xf7fe。 总结: Unicode 制定组织 (Unicode Consortium) 是许多的公司联合决定制定一个包含全世界所有文字 的巨大字集,其中也有亚洲的公司参与。例如:Fujitsu and Fuji Xerox 公司。 该组织取用 ISO 10646 字集然后加入其他的资讯:标准名称及 特性。 Unicode 包含 GB2312 中所有的字及(可能) Big5 码中所有的字。 而且加入了许多其他语言的文字。(ISO 10646 有几种编码方式: UTF-8 是 8-bit 的,而 UTF-16 是 16-bit。 Unicode 是 UTF-16 的形式。
因此 Unicode 比 Big5 及 GB2312 码好 - 因为 Unicode 包含较多的字。 ISO字符集 ASCII中的"A"代表美国,因此ASCII码专门用于书写英语,严格来说是美式英语也就不足为奇了。ASCII码中缺少£、ü、?和许多书写其他语言和地区所需的字符。 可通过指定128以后的更多字符扩展ASCII码。国际标准组织(ISO)定义了几个不同的字符集,它们是在ASCII码基础上增加了其他语言和 地区需要的字符。其中最突出的是ISO8859-1,通常叫做Latin-1。Latin-1包括了书写所有西方欧洲语言不可缺少的附加字符,其中 0~127的字符与ASCII码相同。表7-2给出了128~255之间的字符,同样前32个字符是极少使用的非打印控制字符。
所以对于ISO8859-1和GB2312之间的转换就会出现麻烦了 呵呵 因为通常异种语言之间的转换是通过Unicode来完成的。假设有两种不同的语言A和B,转换的步骤为:先把A转化为Unicode,再把Unicode转化为B。 打个比方吧 有GB2312中有一个汉字“李”,其编码为“C0EE”,欲转化为ISO8859-1编码。步骤为:先把“李”字转化为Unicode,得到 “674E”,再把“674E”转化为ISO8859-1字符。当然,这个映射不会成功,因为ISO8859-1中根本就没有与“674E”对应的字符。 总的来说 一个是中国的 一个是西欧语言
------------------------------------------------------------------------------
iso-8859-1是JAVA网络传输使用的标准 字符集,而gb2312是标准中文字符集,当你作出提交表单等需要网络传输的操作的时候,就需要把 iso-8859-1转换为gb2312字符集显示,否则如果按浏览器的gb2312格式来解释iso-8859-1字符集的话,由于2者不兼容,所以会 是乱码.
------------------------------------------------------------------------------
汉字是双字节的。所谓双字节是指一个双字要占用两个 BYTE的位置(即16位),分别称为高位和低位。中国规定的汉字编码为GB2312,这是强制性的, 目前几乎所有的能处理中文的应用程序都支持GB2312。GB2312包括了一二级汉字和9区符号,高位从0xa1到0xfe,低位也是从0xa1到 0xfe,其中,汉字的编码范围为0xb0a1到0xf7fe。 另外有一种编码,叫做GBK,但这是一份规范,不是强制的。GBK提供了20902个汉字,它兼容GB2312,编码范围为0x8140到0xfefe。GBK中的所有字符都可以一一映射到Unicode 2.0。 在不久的将来,中国会颁布另一种标准:GB18030-2000(GBK2K)。它收录了藏、蒙等少数民族的字型,从根本上解决了字位不足的问题。注意: 它不再是定长的。其二字节部份与GBK兼容,四字节部分是扩充的字符、字形。它的首字节和第三字节从0x81到0xfe,二字节和第四字节从0x30到 0x39