`
hz_chenwenbiao
  • 浏览: 1010589 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

Java中文乱码原因(转)

阅读更多

 

Java在中文环境中乱码无处不在,而且出现的时间和位置也包涵广泛,具体的解决方法也是千奇百怪。
但是如果能理清其中的脉络,理解字符处 理的过程,对于解决问题很有指导意义,不至于解决了问题也不知道为什么。

 
其实,
原因不外乎出在String输入时和输出时。

首先,Java中的任何String都是以UNICODE格式存在的。
很多人因为在GBK环境中使用String,会误以为String是GBK格式,
实际上Java的String类中并没有存储CharSet信息的字段, 所有String中的字符只会以UNICODE的2字节形式存在。
String在构造时会逐一把字符按指定编码(默认使用系统默认编码格式),转换为UNICODE字符,存入一个Char(无符号16位)数组中。

如:
new String(bytes,"gbk");

并不是说,生成一个GBK编码的字符串,而是按GBK逐一辨认字节数组bytes中的字符转化为UNICODE。
假设,bytes本是按GB编码的,构造方法在发现一个最高位为0的byte就作为ascii字符处理,最高位为1就和后面的一个byte合成中文字符, 再转换编码。(
生成一个string时,应该是先用系统的默认编码方式来读入信息,然后转为UNICODE方式进行存储,显示时,将UNICODE 转为系统默认编码再显示
可以看出,在这个过程中,编码选择错误就会导致程序按错误方法辨认bytes,乱码就出现了。
在这里产生的乱码,很多时候还可以通过.getByte()方法修复,还没有后面的严重。

如:
"中".getBytes("iso-8859-1");

因为iso-8859-1中没有中文,所以"中"的值被替换成63,显示'?',无法判断以前是什么值。

所以如下String将被破坏掉:
new String("中文".getBytes("iso-8859-1"),"iso-8859-1");

如果目标编码方式支持中文,就不会损坏String:
new String("中文".getBytes("utf-8"),"utf-8");

Java在显示字符时,还需要进行一次转换,把UNICODE字符转换成用于显示的字符编码形式。
很多时候,这个过程是自动的,会按系统的默认编码(一般是GBK)转换String。
如果和页面编码不一样,就会出现乱码,
虽然在Java的程序中只有一种编码(UNICODE),输出却可以有不同的编码(就是不同的系统的默认编码)

有时候,我们需要用 iso-8859-1格式分解String的中文,以便在不支持中文的系统中存储:
new String("中文".getBytes("GBK"),"iso-8859-1"); 
先通过GBK等支持中文的编码方式分解为byte数组,再做为iso-8859-1字符组成字符串,就避免了被替换为Char(63)。

=========================================================================

示例程序

public static void main(String[] args) 
{  
String str = "中国";  
printBytes("中国的UNICODE编码:", str.getBytes(Charset.forName("unicode")));  
printBytes("中国的GBK编码:", str.getBytes(Charset.forName("GBK")));  
printBytes("中国的UTF-8编码:", str.getBytes(Charset.forName("UTF-8")));  
}  

public static void printBytes(String title, byte[] data) 
{  
System.out.println(title);  
for (byte b : data) 
{  
System.out.print("0x" + toHexString(b) + " ");  
}  
System.out.println();     
}  

public static String toHexString(byte value) 
{  
String tmp = Integer.toHexString(value & 0xFF);  
if (tmp.length() == 1) 
{  
tmp = "0" + tmp;  
}  

return tmp.toUpperCase();  
}  


上例的输出结果为:

中国的UNICODE编码:
0xFE 0xFF 0x4E 0x2D 0x56 0xFD
中国的GBK编码:
0xD6 0xD0 0xB9 0xFA
中国的UTF-8编码:
0xE4 0xB8 0xAD 0xE5 0x9B 0xBD

 

分享到:
评论

相关推荐

    java中文乱码之解决URL中文乱码问题的方法

    在Java开发中,遇到中文乱码问题是一种常见的挑战,特别是在处理URL时。URL中文乱码问题主要是由于URL编码和解码过程中的不一致导致的。下面将详细介绍如何解决这个问题,并探讨几种常用的方法。 首先,我们需要...

    java中文乱码解决问题

    JAVA 中文乱码问题是开发过程中常见的问题之一,解决这个问题需要了解乱码产生的原因,然后对症下药。下面我们对容易产生乱码问题的场景进行分析,并提出解决方案。 1. 以 POST 方法提交的表单数据中有中文字符 在...

    Java关于中文乱码问题的多种解决方法

    在Java编程中,中文乱码问题是一个常见的困扰,尤其是在处理文件读写、网络传输或数据库操作时。本文将深入探讨几种解决Java中中文乱码问题的方法,并以MyEclipse为开发环境,结合实际示例进行讲解。 1. 文件读写中...

    [Java]PDF转图片解决中文乱码.zip

    总之,这个名为"PDF2img"的DEMO利用PDFBox库解决了在Java环境中PDF转图片时中文乱码的问题,对于需要处理大量中文PDF文档的开发者来说,这是一个非常实用的工具。通过深入理解和使用PDFBox,我们可以构建更复杂的...

    java中文乱码问题详解--- java中文乱码问题详解

    针对上述原因,我们可以采取以下措施来解决Java中文乱码问题: 1. **统一编码格式**:确保开发环境中所有相关的编码设置都使用统一的标准,如UTF-8。这包括文件保存时的编码、编译器的编码设置以及JVM的默认字符集...

    java中文乱码大全

    Java中文乱码问题是编程者在开发Java应用程序时经常遇到的问题,尤其是涉及到中文字符处理时。这些问题产生的根本原因在于Java内部采用UNICODE编码,而不同的操作系统和浏览器可能支持不同的编码格式,如Windows中文...

    java中文乱码问题

    Java 中文乱码问题详解 Java 中文乱码问题是一个老生常谈的问题,特别是在 Web 应用中。今天,我们将从编码角度分析 Java 编译后在控制台和 Web 等终端显示乱码问题。 一、 Java 处理字符的原理 Java 使用 ...

    Java中文乱码浅析及解决方案

    综上所述,解决Java中文乱码问题的关键在于确保整个程序的编码一致性,包括源代码、编译器、运行环境、文件读写、网络传输以及数据库操作等环节。通过细心配置和适当地指定编码,我们可以有效地避免乱码问题,确保...

    java汉字乱码终极解决代码

    开发中前台页面向后台传参,汉字乱码,看了好多网上的方法都解决不了,所以写了一个工具类,判断是乱码就转换,不乱码就不乱换,汉字字母符号自动判断。最后完美解决汉字乱码问题。

    java 中文乱码 处理

    ### Java中文乱码处理 在Java开发过程中,中文乱码问题常常令人头疼,尤其是在Web应用中,客户端提交的数据经常会出现编码不一致导致的乱码问题。本文将介绍几种解决Java中中文乱码的方法,希望能对您有所帮助。 #...

    java中文乱码问题解决

    本文将深入分析Java中文乱码问题的根本原因,介绍各种编码格式的区别和应用场景,并提供解决乱码问题的方法和经验。 在Java中,常见的编码格式有: * ASCII码:总共有128个,用一个字节的低7位表示,0~31是控制...

    Java生成pdf文件,解决中文乱码问题.pdf

    Java 生成 PDF 文件,解决中文乱码问题 Java 生成 PDF 文件,解决中文乱码问题是 Java 编程中常见的问题。解决这个问题的关键是正确地设置中文字体,以避免乱码问题。本文将通过一个完整的示例代码,详细讲解如何...

    Java 中文乱码问题

    总结一下,Java中文乱码问题的解决主要依赖于以下几个关键点:正确设置源代码的编码、指定JVM的字符编码、理解并正确处理文件和网络通信的字符编码。通过细心的检查和配置,大部分乱码问题都能得到解决。同时,了解...

    JAVA中文乱码深度分析

    解决Java中文乱码问题通常涉及以下几个方面: - 源代码编码:使用UTF-8编码保存.java文件,避免与系统默认编码冲突。 - 设置`file.encoding`:通过启动参数`-Dfile.encoding=UTF-8`设定JVM的字符编码。 - 流处理:在...

    Java中文乱码解决之道

    阅读许多关于中文乱码的解决办法的博文后,发现对于该问题我们都(更加包括我自己)没有一个清晰明了的认识,于是LZ想通过这系列博文(估计只有几篇)来彻底分析、解决java中文乱码问题,如有错误之处望各位同仁指出...

    java zip解压中文乱码问题

    网上很多描述java解压中文乱码的问题,很多描述不全.由于工作需要整理出一个完整版.简单实用.下载后请从ZipUtil.java的main方法开始,一目了然. public static void main(String args[]) { new ZipUtil().unZip("E:\\...

    java读写csv文件,中文乱码问题

    总的来说,处理Java中CSV文件的中文乱码问题主要涉及正确设置字符编码,而给定的.NET DLL文件与此问题的解决没有直接关联。如果你在.NET环境中遇到类似问题,可以参考.NET的编码处理方式,或者寻找适合的.NET库来...

    java获取乱码问题

    #### 二、乱码原因分析 1. **客户端与服务器端编码不一致**:客户端在发送请求时使用的编码格式与服务器端接收请求时采用的编码格式不同。 2. **Tomcat默认配置问题**:Tomcat服务器默认使用ISO-8859-1作为HTTP请求...

    JAVA反编译文件解决中文乱码

    本文将详细介绍如何解决JAVA反编译文件时的中文乱码问题。 首先,理解问题的根源:Java源代码默认采用UTF-8编码,但某些情况下,源代码可能使用了其他编码方式,如GBK。当这些源代码被编译成字节码后,再用不支持...

Global site tag (gtag.js) - Google Analytics