`
wangyanlong0107
  • 浏览: 502710 次
  • 性别: Icon_minigender_1
  • 来自: 沈阳
社区版块
存档分类
最新评论

【转】第二篇:JAVA字符编码系列二:Unicode,ISO-8859-1,GBK,UTF-8编码

 
阅读更多

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与各编码之间的交叉转换(编码不变,bit流不变,只是按照读出的字符集不同)
在上面直接转换中,由字符串(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,这样无论用哪种编码构造时都会产生一个?乱码。(内码转换的中间表是1:2的关系
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涓枃。

 

分享到:
评论

相关推荐

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

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

    Java字符编码及获取文件编码

    首先,我们了解基本的字符编码体系,如ASCII、ISO-8859-1和Unicode。ASCII是最基础的7位编码,可表示128个不同的字符,主要针对英语字符。ISO-8859-1是8位编码,支持更多的西欧字符。而Unicode则是一个广泛采用的...

    java 编码,乱码,字符系列(1)

    1. 源代码编码:Java源代码默认使用的是UTF-8编码,但开发者可以通过在文件头部添加`/* -*- coding: XXX -*- */`注释来指定不同的编码方式。然而,如果不一致,可能会导致编译时出现乱码问题。 2. 字符串字面量编码...

    java编码总结1

    在Java中,字符编码涉及到字符集(Charset)的概念,如ASCII、ISO-8859-1、GBK、UTF-8等,每种都有其特定的用途和适用场景。 【标签】:“源码”提示我们可能涉及到了Java代码的编写和理解,编码规范、注释、异常...

    解决source insight3.5不支持中文utf8问题

    这个问题主要源于Source Insight对非ASCII字符的处理机制,它可能期望的是其他字符集,如GBK或ISO-8859-1。 解决这个问题的方法通常包括以下步骤: 1. **配置Source Insight的编码设置**:进入Source Insight的...

    字符集编码的识别(zz)

    然后是扩展的8位编码,如ISO-8859-1,以及针对中文的GBK编码等。 2. **Unicode与UTF-8**:Unicode是一个统一的字符集,包含了世界上几乎所有的文字。而UTF-8是Unicode的一个实现,它使用变长字节编码,广泛应用于...

    java 获取文件编码

    文件编码决定了文件中字符的二进制表示,常见的编码有ASCII、ISO-8859-1、GBK、GB2312以及Unicode家族的UTF-8、UTF-16等。其中,UTF-8是最广泛使用的编码,支持全球大部分语言;GBK是中国大陆常用的一种多字节编码,...

    java解析文件乱码解决

    常见的字符编码有ASCII、ISO-8859-1、GB2312、GBK、GB18030以及Unicode(包括UTF-8、UTF-16等)。在Java中,默认的字符编码是平台相关的,通常在Windows上是GBK,在Unix或Linux系统中可能是UTF-8。 当读取一个文本...

    获取文件编码方式的两种方式(1.cpdetector第三方jar包,包含源码elipse项目;2.EncodingDetect.java工具类)

    在实际应用中,你可能需要根据文件的实际情况调整检测策略,例如增加对GBK、ISO-8859-1等常见编码的支持。同时,对于大型项目,使用成熟的第三方库如`cpdetector`通常更为可靠,因为它已经经过了广泛的测试和优化。...

    java自动识别网站 文件的编码

    通常,当我们从网站下载或抓取数据时,文件的编码可能会有所不同,如UTF-8、GBK、ISO-8859-1等,因此,自动识别正确的编码对于正确解析和显示文本至关重要。 首先,我们需要理解字符编码的基本概念。字符编码是一种...

    多种语言(big5\gbk\gb2312\utf8\Shift_JIS\iso8859-1)的网页编码切换解决方案归纳

    不同的语言字符集有着不同的编码标准,常见的编码包括big5、gbk、gb2312、utf8、Shift_JIS、iso8859-1等。为了确保网页能够正确地展示各种语言,就需要一种有效的编码切换解决方案。 首先,Web服务器发送给客户端的...

    Web下Java语言如何访问不同字符集的Oracle数据.pdf

    例如,如果数据库使用的是ISO 8859-1,那么Java程序需要将输入输出流的编码设置为"ISO-8859-1"。这可以通过`java.nio.charset.Charset`类和`java.io.InputStreamReader`、`java.io.OutputStreamWriter`等类来实现。 ...

    字节流编码获取

    常见的字符编码有ASCII、ISO-8859-1、GB2312、GBK、UTF-8、UTF-16等。其中,ASCII是最基础的编码,只能表示128个基本拉丁字符;而UTF-8是一种变长编码,能表示Unicode字符集中的所有字符,且在Web应用中最为常见。 ...

    批量转换文件编码工具

    如果文件不是以UTF-8编码的,而代码中假设它是,那么可能会出现乱码。此时,批量转换工具就显得尤为必要,它可以确保文件以Java期望的格式读取或写入。 批量转换过程可能涉及以下步骤: 1. **扫描目录**:程序首先...

    Struts原理与实践 ——

    #### 一、从ASCII到Unicode (UTF-8) 在探讨Struts框架及其应用场景之前,首先需要理解字符编码的基本概念,特别是从ASCII到Unicode的发展历程,这对于避免读写数据库时出现乱码问题至关重要。 ##### 1. ASCII与...

    使用cpdetector 三方库读取文件编码

    jchardet基于统计模型,能够识别出Unicode的各种变体和其他多种编码方式,如ISO-8859系列、EUC系列、Shift_JIS、GBK等。 **使用cpdetector读取文件编码步骤:** 1. **添加依赖**:首先,你需要将cpdetector的jar包...

    JAVA学习笔记.docx

    - **字符编码**:JAVA源代码使用Unicode编码,支持ASCII、ISO8859-1、GBK/GB2312和UTF系列等多种编码。 - **变量**:存储数据,包括声明、赋值和变量分类(局部变量、成员变量)。 - **类型转换**:包括自动类型...

    Java语言基础

    常见的字符编码包括ASCII、ISO-8859-1、GB2312/GBK/GB18030、Unicode等。其中,Unicode旨在统一所有文字编码,并有几种实现方式,如UTF-8、UTF-16和UTF-32。UTF-8编码因节省空间而被广泛使用。 变量是存储数据的...

    Java中文乱码原因

    在示例程序中,展示了将中文字符串转化为Unicode、GBK和UTF-8编码的字节数组的过程。Unicode编码的字节数组以BOM(Byte Order Mark)开始,即0xFE 0xFF,这是Unicode的标志。GBK编码的字节数组通常比UTF-8短,因为它...

    ant1.8.4.zip

    1. **Ant默认编码设置**:早期版本的Ant可能默认使用的是非UTF-8的编码,例如ISO-8859-1,这在处理中文字符时会出现问题。用户可以通过配置`<project>`标签中的`defaultencoding`属性,将其更改为UTF-8来解决。 2. ...

Global site tag (gtag.js) - Google Analytics