1、函数介绍
在Java中,字符串、字符(String、char)是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中文的unicode码)-〉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涓枃。
分享到:
相关推荐
### JAVA字符编码详解:Unicode, ISO-8859-1, GBK, UTF-8 及其相互转换 #### 一、引言 在Java编程中,字符编码的管理和转换是一项基本而又重要的任务。不同的编码标准适用于不同的场景,而理解和掌握这些编码之间...
本文将深入探讨标题提及的“DELPHI 10.3编码转换:iso-8859-1转GBK,GBK转iso-8859-1”,以及在二维码生成中的应用,以解决乱码问题。 首先,我们需要理解两种编码系统的基础知识。`ISO-8859-1`是一种单字节编码...
### 关于JAVA字符编码:Unicode, ISO-8859-1, GBK, UTF-8 编码及相互转换 在Java开发过程中,字符编码是处理文本数据的基础,不同的编码方式会影响数据的存储、传输以及显示。本文将详细介绍几种常见的字符编码...
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 转 UTF-8”、“gb2312 转 UTF-8”以及“Iso-8859-1 转 UTF-8”是指将使用这些编码格式的文件转换成UTF-8编码。这是因为UTF-8具有广泛的兼容性和通用性,许多系统和软件默认使用UTF...
3. **UTF-8编码**:UTF-8是一种可变长度的Unicode编码方式,支持世界上几乎所有语言的文字,包括中文。UTF-8的最大特点是兼容ASCII,且对于英文字符只需要一个字节,因此在网络传输中非常高效。 #### 二、乱码问题...
本文将深入探讨四种常见的字符集编码:ISO-8859-1、GBK、GB18030以及Unicode,并结合Java国际化的字符集转换进行详细说明。 1. ISO-8859-1:这是一种西欧字符编码,包含拉丁字母、数字、标点符号和一些特殊字符。它...
libiconv是一个广泛使用的字符编码转换工具,它支持多种编码格式,包括UTF-8和GBK。 UTF-8是一种变长的Unicode编码方式,每个Unicode字符可以被表示为1到4个字节。GBK,全称为“国标汉字扩展A区”,是中国大陆广泛...
判断是否为UTF-8的方法是基于ISO-8859-1编码转换为UTF-8后字符串长度的变化。因为ISO-8859-1是单字节编码,转换为UTF-8后,单字节的字符长度不变,但多字节字符会变成多个字节,所以长度会有变化。 在Web应用开发中...
5. **字符转换gb2utf8**:这个压缩文件中的"字符转换gb2utf8"很可能是一个程序或脚本,用于将GB2312编码的文件转换成UTF-8编码。在实际操作中,用户可能需要先将文件解压缩,然后运行该程序,按照提示完成转换过程。...
- 解决方法:先将UTF-8编码的字节流转换为Unicode,然后再从Unicode转换为GBK。 - 示例:`String s = "中文"; byte[] utf8s = s.getBytes("UTF-8"); String uni = new String(utf8s, "UTF-8"); byte[] gbks = uni....
UTF,全称为“Unicode Transformation Format”,是一种广泛使用的国际编码标准,它包含了世界上几乎所有的字符集,包括汉字、拉丁字母、希腊字母等,最常用的是UTF-8编码。UTF-8的特点是兼容ASCII编码,对于英文...
UTF-8是最常见的一种,而UTF-8-Unicode通常指的是使用UTF-8编码的Unicode字符集。 ISO-8859-1是西方语言的单字节编码标准,它只能表示128个字符,不支持中文。在中国,ISO-8859-1通常用于与西方国家交流时的非中文...
本文将深入探讨如何在VB中将ANSI编码转换为UTF-8编码,以及在实际应用中的网络编程基础知识,特别是利用Winsock控件实现简单的聊天程序。 首先,理解ANSI和UTF-8的区别至关重要。ANSI编码,通常指的是基于特定区域...
2. **UTF-8到GBK的转换**:同样,当需要在仅支持GBK编码的环境中显示或处理文件时,此工具也能将UTF-8编码的文件转换为GBK编码。 3. **全文件夹转换**:工具提供批量转换功能,可以一次性处理整个文件夹内的所有...
反之,如果一个UTF-8编码的文本被当作GBK处理,也可能导致类似问题。因此,理解各种字符集的特性和范围,以及如何在它们之间转换,是开发跨平台、多语言应用时必不可少的知识。 在提供的文件列表中,UTF-16.txt、...
UTF-8是最广泛使用的编码格式,它使用8位字节,并根据字符的不同范围使用1至4个字节进行编码。UTF-8的一个显著优点是与CPU字节顺序无关,具有良好的平台兼容性和错误容错能力。UTF-16则是16位的编码,与Unicode的...
ANSI通常指的是特定地区的默认编码,如Windows系统中的GBK或ISO-8859-1,它通常只能表示有限的字符集。Unicode则是一个国际标准,包含了世界上几乎所有的字符,包括汉字、拉丁字母、希腊字母等,旨在统一各种字符...
3. **页面`<meta>`标签**: 确保页面中的`<meta>`标签也正确地声明了utf-8编码。例如: ```html <meta charset="utf-8"> ``` 4. **测试**: 在完成上述配置后,重新测试页面在不同浏览器中的表现,以确认问题是否...