`
ejacky
  • 浏览: 31960 次
  • 性别: Icon_minigender_1
  • 来自: 抚顺
社区版块
存档分类
最新评论

Unicode,ISO-8859-1,GBK,UTF-8编码及相互转换

    博客分类:
  • java
阅读更多
1、函数介绍
在Java中,字符串用统一的Unicode编码,每个字符占用两个字节,与编码有关的两个主要函数为:
1)将字符串用指定的编码集合解析成字节数组,完成Unicode-〉charsetName转换
public byte[] getBytes(String charsetName) throws UnsupportedEncodingException 

2)将字节数组以指定的编码集合构造成字符串,完成charsetName-〉Unicode转换
public String(byte[] bytes, String charsetName) throws UnsupportedEncodingException

2、Unicode与各编码之间的直接转换
下面以对中文字符串"a中文"的编码转换为例,来了解各种编码之间的转换
1)Unicode和GBK
测试结果如下,每个汉字转换为两个字节,且是可逆的,即通过字节可以转换回字符串
String-GBK〉ByteArray:\u0061\u4E2D\u6587(a中文)-〉0x61 0xD6 0xD0 0xCE 0xC4
ByteArray-GBK〉String:0x61 0xD6 0xD0 0xCE 0xC4-〉\u0061\u4E2D\u6587(a中文)

2)Unicode和UTF-8
测试结果如下,每个汉字转换为三个字节,且是可逆的,即通过字节可以转换回字符串
String-UTF-8〉ByteArray:\u0061\u4E2D\u6587(a中文)-〉0x61 0xE4 0xB8 0xAD 0xE6%0x96 0x87
ByteArray-UTF-8〉String:0x61 0xE4 0xB8 0xAD 0xE6%0x96 0x87-〉\u0061\u4E2D\u6587(a中文)
3)Unicode和ISO-8859-1
测试结果如下,当存在汉字时转换失败,非可逆,即通过字节不能再转换回字符串
String-ISO-8859-1〉ByteArray:\u0061\u4E2D\u6587(a中文)-〉0x61 0x3F 0x3F
ByteArray-ISO-8859-1〉String:0x61 0x3F 0x3F-〉\u0061\u003F\u003F(a??)
3、Unicode与各编码之间的交叉转换
在上面直接转换中,由字符串(Unicode)生成的字节数组,在构造回字符串时,使用的是正确的编码集合,如果使用的不是正确的编码集合会怎样呢?会正确构造吗?如果不能正确构造能有办法恢复吗?会信息丢失吗?

下面我们就来看看这种情况,这部分可以说明在某些情况下虽然我们最终正确显示了结果,但其间仍然进行了不正确的转换。

1)能够正确显示的中间不正确转换
我们知道String-GBK〉ByteArray-GBK〉String是正确的,但如果我们采用String-GBK〉ByteArray-ISO-8859-1〉String呢?通过测试结果如下:
String-GBK〉ByteArray-ISO-8859-1〉String:\u0061\u4E2D\u6587(a中文)-〉0x61 0xD6 0xD0 0xCE 0xC4-〉\u0061\u00D6\u00D0\u00CE\u00C4(a????)

这时我们得到的字符串为?乱码“a????”,但是通过继续转换我们仍然可以复原回正确的字符串“a中文”,过程如下:
String-GBK〉ByteArray-ISO-8859-1〉String-ISO-8859-1〉ByteArray-GBK〉String
对应:\u0061\u4E2D\u6587(a中文)-〉0x61 0xD6 0xD0 0xCE 0xC4-〉\u0061\u00D6\u00D0\u00CE\u00C4(a????)-〉0x61 0xD6 0xD0 0xCE 0xC4-〉\u0061\u4E2D\u6587(a中文)

也就是我们在首次构造字符串时,我们用了错误的编码集合得到了错误的乱码,但是我们通过错上加错,再用错误的编码集合获取字节数组,然后再用正确的编码集合构造,就又恢复了正确的字符串。这时就属于是“能够正确显示的中间不正确转换”。在Jsp页面提交数据处理时常常发生这种情况。

此外能够正确显示的中间不正确转换还有:
String-UTF-8〉ByteArray-ISO-8859-1〉String-ISO-8859-1〉ByteArray-UTF-8〉String

String-UTF-8〉ByteArray-GBK〉String-GBK〉ByteArray-UTF-8〉String
对应:\u0061\u4E2D\u6587(a中文)-〉0x61 0xE4 0xB8 0xAD 0xE6%0x96 0x87-〉\u0061\u6D93\uE15F\u6783(a涓枃)-〉0x61 0xE4 0xB8 0xAD 0xE6%0x96 0x87-〉\u0061\u4E2D\u6587(a中文)

4、编码过程中错误诊断参考
1)一个汉字对应一个问号
在通过ISO-8859-1从字符串获取字节数组时,由于一个Unicode转换成一个byte,当遇到不认识的Unicode时,转换为0x3F,这样无论用哪种编码构造时都会产生一个?乱码。
2)一个汉字对应两个问号
在通过GBK从字符串获取字节数组时,由于一个Unicode转换成两个byte,如果此时用ISO-8859-1或用UTF-8构造字符串就会出现两个问号。
若是通过ISO-8859-1构造可以再通过上面所说的错上加错恢复(即再通过从ISO-8859-1解析,用GBK构造);
若是通过UTF-8构造则会产生Unicode字符"\uFFFD",不能恢复,若再通过String-UTF-8〉ByteArray-GBK〉String,则会出现杂码,如a锟斤拷锟斤拷
3)一个汉字对应三个问号
在通过UTF-8从字符串获取字节数组时,由于一个Unicode转换成三个byte,如果此时用ISO-8859-1构造字符串就会出现三个问号;用GBK构造字符串就会出现杂码,如a涓枃。

链接:http://blog.csdn.net/wonder4/archive/2007/06/26/1667158.aspx
分享到:
评论

相关推荐

    JAVA字符编码:Unicode,ISO-8859-1,GBK,UTF-8编码及相互转换

    ### JAVA字符编码详解:Unicode, ISO-8859-1, GBK, UTF-8 及其相互转换 #### 一、引言 在Java编程中,字符编码的管理和转换是一项基本而又重要的任务。不同的编码标准适用于不同的场景,而理解和掌握这些编码之间...

    DELPHI 10.3编码转换 iso-8859-1转GBK,GBK转iso-8859-1

    本文将深入探讨标题提及的“DELPHI 10.3编码转换:iso-8859-1转GBK,GBK转iso-8859-1”,以及在二维码生成中的应用,以解决乱码问题。 首先,我们需要理解两种编码系统的基础知识。`ISO-8859-1`是一种单字节编码...

    关于JAVA字符编码:Unicode,ISO-8859-1,GBK,UTF-8编码及相互转换

    ### 关于JAVA字符编码:Unicode, ISO-8859-1, GBK, UTF-8 编码及相互转换 在Java开发过程中,字符编码是处理文本数据的基础,不同的编码方式会影响数据的存储、传输以及显示。本文将详细介绍几种常见的字符编码...

    java 编码 UTF-8、ISO-8859-1、GBK

    UTF-8、ISO-8859-1 和 GBK 是三种常见的字符编码格式,每种都有其特定的应用场景和优缺点。 首先,UTF-8 是一种广泛使用的多字节编码,能够表示几乎所有的Unicode字符,包括中文。在Java中,UTF-8 支持国际化,是...

    GBK GB2312 UTF-8 ISO-8859-1区别

    字符编码标准之GBK、GB2312、UTF-8和ISO-8859-1的比较 字符编码标准是计算机领域中的一项基本技术,用于将文字或符号转换为计算机能够识别的二进制代码。常见的字符编码标准有GBK、GB2312、UTF-8和ISO-8859-1等,...

    批量转 GBK 转 UTF-8 gb2312 Iso-8959-1 转 UTF-8

    在标题和描述中提到的“批量转 GBK 转 UTF-8”、“gb2312 转 UTF-8”以及“Iso-8859-1 转 UTF-8”是指将使用这些编码格式的文件转换成UTF-8编码。这是因为UTF-8具有广泛的兼容性和通用性,许多系统和软件默认使用UTF...

    各种字符集编码表,包括iso-8859-1,gbk,gb18030, unicode

    本文将深入探讨四种常见的字符集编码:ISO-8859-1、GBK、GB18030以及Unicode,并结合Java国际化的字符集转换进行详细说明。 1. ISO-8859-1:这是一种西欧字符编码,包含拉丁字母、数字、标点符号和一些特殊字符。它...

    乱码 编码方式解决 gbk ISO8859-1 utf8 编码

    3. **UTF-8编码**:UTF-8是一种可变长度的Unicode编码方式,支持世界上几乎所有语言的文字,包括中文。UTF-8的最大特点是兼容ASCII,且对于英文字符只需要一个字节,因此在网络传输中非常高效。 #### 二、乱码问题...

    windows下利用libiconv将实现utf8和gbk编码之间转换

    libiconv是一个广泛使用的字符编码转换工具,它支持多种编码格式,包括UTF-8和GBK。 UTF-8是一种变长的Unicode编码方式,每个Unicode字符可以被表示为1到4个字节。GBK,全称为“国标汉字扩展A区”,是中国大陆广泛...

    ISO-8859.docx

    判断是否为UTF-8的方法是基于ISO-8859-1编码转换为UTF-8后字符串长度的变化。因为ISO-8859-1是单字节编码,转换为UTF-8后,单字节的字符长度不变,但多字节字符会变成多个字节,所以长度会有变化。 在Web应用开发中...

    java编码格式转换

    - 解决方法:先将UTF-8编码的字节流转换为Unicode,然后再从Unicode转换为GBK。 - 示例:`String s = "中文"; byte[] utf8s = s.getBytes("UTF-8"); String uni = new String(utf8s, "UTF-8"); byte[] gbks = uni....

    编码转换器 绿色版 gb2312 gbk utf-8

    4. **万能转换**:这个标签意味着该软件支持多种编码格式之间的转换,不仅限于GB2312、GBK和UTF-8,可能还包括其他编码格式,如Big5、ISO-8859-1等。 5. **字符转换gb2utf8**:这个压缩文件中的"字符转换gb2utf8"很...

    网站编码转换工具,utf,gb2312,gbk,iso

    UTF,全称为“Unicode Transformation Format”,是一种广泛使用的国际编码标准,它包含了世界上几乎所有的字符集,包括汉字、拉丁字母、希腊字母等,最常用的是UTF-8编码。UTF-8的特点是兼容ASCII编码,对于英文...

    VB中ANSI转换成UTF-8

    本文将深入探讨如何在VB中将ANSI编码转换为UTF-8编码,以及在实际应用中的网络编程基础知识,特别是利用Winsock控件实现简单的聊天程序。 首先,理解ANSI和UTF-8的区别至关重要。ANSI编码,通常指的是基于特定区域...

    GBK转UTF8工具 网页编码 互转工具

    GBK编码,全称“汉字内码扩展规范”(GBK, Chinese Internal Code Specification),是中国大陆使用的一种汉字编码标准,基于GB2312并兼容ISO-8859-1,共收录了20902个汉字,以及符号等,主要应用于简体中文环境。...

    C语言UTF8到ANSI和Unicode转换代码

    ANSI通常指的是特定地区的默认编码,如Windows系统中的GBK或ISO-8859-1,它通常只能表示有限的字符集。Unicode则是一个国际标准,包含了世界上几乎所有的字符,包括汉字、拉丁字母、希腊字母等,旨在统一各种字符...

    ISO8859-1字符集与其他字符集兼容性测试

    反之,如果一个UTF-8编码的文本被当作GBK处理,也可能导致类似问题。因此,理解各种字符集的特性和范围,以及如何在它们之间转换,是开发跨平台、多语言应用时必不可少的知识。 在提供的文件列表中,UTF-16.txt、...

    zwbmxj.zip_UTF8_gb2312 utf8_utf8-unicode_汉字 编码_汉字编码

    UTF-8是最常见的一种,而UTF-8-Unicode通常指的是使用UTF-8编码的Unicode字符集。 ISO-8859-1是西方语言的单字节编码标准,它只能表示128个字符,不支持中文。在中国,ISO-8859-1通常用于与西方国家交流时的非中文...

    HTML1114 (HTTP 标头)的代码页 gb2312 覆盖(META 标记)的冲突的代码页 utf-8

    1. **检查HTTP响应头**: 验证HTTP响应头中的`Content-Type`字段是否正确指定了utf-8编码。 2. **DOMINO配置修改**: 如果使用的是IBM Domino服务器,需要确保服务器文档中的Internet协议(Domino Web引擎字符集)设置...

    好东西 mySQL数据库latin1-gbk,gbk-utf8,gbk-big5

    latin1,也称为ISO-8859-1,是最早的ASCII扩展,包含了基本的拉丁字母和一些特殊符号,不支持中文字符。在早期的MySQL数据库中,如果数据包含中文或其他非拉丁字符,可能会存储为乱码。 gbk是中国大陆广泛使用的...

Global site tag (gtag.js) - Google Analytics