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

Java中文编码转换分析

    博客分类:
  • java
阅读更多
通常,我们遇到中文问题的来源一般都是,在jsp等显示到页面时,出现问题。
若想知道为什么出现乱码,就要从了解jsp --- > servlet --- > class 开始
其实,问题主要在 servlet  --- > class 上,也就是  javac <*.java> 文件时出现了问题,

也许你要问为什么?这就是我下面要和大家讨论的。

首先,大家要清楚java的内核是unicode的,就连class文件也是,然后,日常应用中很多都是使用字节流的,包括文件流的保存方式。因此java要对此进行转换。

char  ----------   unicode   
byte  ----------   字节

java中的byte / char 互转的函数在sun.io的包中。

public static bytetocharconverter getdefault() ;
  public static bytetocharconverter getconverter(string encoding);

如果你向converter指定encoding ,则系统会自动使用当前的encoding, gb平台上用gbk ,en平台上用 8859_1 。


下面,是我在中文xp系统下的一段代码:

import java.io.FileWriter;
import java.io.IOException;
public class testEncoding {
    public void test(){
           String str = "你";
           try{
           FileWriter write=new FileWriter("test.txt");
           write.write(str);
           write.close();
           }catch(IOException e){
               System.out.println("has not found test.txt file !");      

           }    

    }    

   
    public static void main(String[] args){

           testEncoding instance = new testEncoding();

           instance.test();

    }    

}
//javac -encoding gbk/iso8859-1/utf-8  [常用的编码方式]
//测试结果,默认不用-encoding编译 和  选用 -encoding gbk 都是正常显示 “你”;
//如果用 -encoding utf-8/ios8859-1 则显示乱码 “??”

分析:String和byte[]
  String其实核心是char[],然而要把byte转化成String(或者String --- > byte),必须经过编码。 string.length()其实就是char数组的长度,如果使用不同的编码,很可能会错分,造成散字和乱码。就好像上面例子中,错用javac –encoding ios8859-1 testEncoding.java 后,运行后文件中显示 “??” 一样。

分析:reader,writer / inputstream,outputstream
  reader和writer核心是char,inputstream和outputstream核心是byte。但是reader和writer的主要目的是要把char读/写inputstream/outputstream 。这里用不同的编码格式会对结果造成不一样的影响。

分析:javac –encoding 参数

  我们常常没有用到encoding这个参数。其实encoding这个参数对于跨平台的操作是很重要的。
  如果没有指定encoding,则按照系统的默认encoding,gb平台上是gb2312,英文平台上是iso8859_1。 
 --java的编译器实际上是调用sun.tools.javac.main的类,对文件进行编译,这个类的compile函数中间有一个encoding的变量,-encoding的参数其实直接传给encoding变量。 编译器就是根据这个变量来读取java文件的,然后按照设定的encoding格式编译成class文件。
总结:

如果我们只是自己写一个或2个文件,那编码格式无所谓,怎么解决都可以,但是,对于开发人员,我们面对的通常都是一个庞大的系统,快平台也是很正常的,所以在编码格式上很难全局控制,一个企业化的解决方案就是,在系统中,无论html,jsp,java,只要是中文,都不要直接输入,采用资源串的方式来编写。这样才能形成真正的产品。

中文/英文资源串  可以利用  java.util. Properties;  来处理  。

如果你的系统支持struts, 也可以利用  org.apache.struts.util.MessageResources来处理 。

利用资源串处理中英文字符问题还有另外4个好处:
[1]、很多地方的资源串都是可以重复使用的(当然,为了模块独立,不同模块就算同样的字符也建议在不同的资源串文件写)
[2]、当很多地方的同意个字符串需要修改时,只要改写一个地方就ok了
[3]、如果要求系统支持中英文转换,那么,只要在显示资源串时根据local判断就可以了
[4]、在编码转换上,有很好的平台移植性,不用每次都考虑服务器上的编码方式,本地的编码方式,然后再写n个转换库。性能是也会有一定的影响。
另外大家需要注意我们常用的应用服务器tomcat的默认编码格式:iso8859-1

定义位置:tomcat下的web.xml 第一行:

<?xml version="1.0" encoding="ISO-8859-1"?>

通常系统开发后,很多应用服务器都需要打包发布,首推工具当然是ant了(好东西啊!)。

在用ant编译系统时,设定编码方式:

<!-- ================================================================ -->
<!--Compiles the java source code in  the local                                      -->
<!--================================================================ -->
<target name="compile.java" depends="prepare">
        <javac encoding="${encoding}" destdir="${build.dir}/WEB-INF/classes" debug="on" deprecation="off" optimize="off"
            srcdir="${webapp.path}/WEB-INF/classes" classpathref="run.classpath">
            <include name="com/**/*.java"/>
        </javac>
        <copy todir="${build.dir}/WEB-INF/classes/com/neusoft/ehr/replets/standard">
            <fileset dir="${src.dir}/WEB-INF/classes/com/neusoft/ehr/replets/standard" includes="**/*.srt"/>
        </copy>
</target> 
在我现在工作的系统中,jsp全部通过
<%@page contentType="text/html;charset=UTF-8"%>   指定编码方式
从上到下,我们整个系统无论在页面,编译,都采用相同的编码格式(UTF-8)
当然你也可以根据自己的需要设定自己的格式,但一定要统一(否则,有很多问题会找你的)。
选择UTF-8原因:大部分浏览器ie其高级设置中始终以utf-8发送url的选项缺省是选上的。
以我们的系统举例,我们用Eclipse来开发系统平台,开发时,通常为了修改bug,都要在本地直接用本地源代码进行系统发布,如果此时在java中直接写中文,在中文系统是没问题,但如果用设定了utf-8的ant编译后,就会出现中文,因为Eclipse默认的编码方式是GBK,就像我在第一个例子中说的那样
javac -encoding gbk/utf-8  显示出了不同。
不用资源串的项目事例:
在此,也多提一下,曾经在上海财大,我们公司其他部门的兄弟们作了个系统,也是很大的系统,但是整个系统都没有采用资源串,直接用中文,他们采取的方法大概是:
1、  获得服务端的编码方式
2、  获得客户端的编码方式
3、  写n个转换库,对编码格式进行转换
4、  (很多服务器,例如 HPUnix,经常需要设定服务器的环境变量,以处理编码)
优点:写的时候很方便,改的时候也可以
缺点:跨平台性差,不能全局替换

最后,本文摘自华为CodeBase。
分享到:
评论

相关推荐

    Java文件编码转换源码

    在实际应用中,确保正确选择编码是至关重要的,否则可能会导致乱码问题。因此,理解各种编码之间的关系,以及如何在Java中有效地进行转换,对于开发跨平台的软件尤其关键。 最后,虽然这个示例代码没有涵盖所有可能...

    java 中文Unicode转换

    总的来说,Java提供了丰富的API来处理Unicode编码,无论是转换中文字符还是从Unicode码点恢复字符,都可以轻松实现。在处理多语言文本时,理解和熟练运用Unicode编码是至关重要的。通过上述方法,你可以有效地在Java...

    java编码转换工具

    java编码转换工具

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

    #### 三、Java编码转换的详细过程 Java程序从开发到运行的过程中,涉及到多个环节的编码转换,主要包括: 1. **源文件编码**:Java源文件(`.java`)在保存时通常采用操作系统默认的编码格式。例如,在中文Windows...

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

    总之,解决Java中的URL中文乱码问题需要理解URL编码的原理,并在客户端和服务器端采取相应的措施,确保编码和解码的一致性。无论是通过JavaScript编码、Java服务器端解码,还是调整服务器配置,关键在于确保字符集的...

    java 文件编码转换

    标题"java 文件编码转换"指的是使用Java来解决文件编码问题,而描述中提到的"提供一个jar包和一个java文件"则暗示了我们可以通过这两个文件实现这个功能。 首先,`chardet.jar`可能是一个字符集检测库,用于自动...

    JAVA中文乱码深度分析

    2. JAVA编码转换的详细过程: - 编程阶段:在中文操作系统(如Win2K)上,使用编辑器(如记事本)保存的.java文件采用系统默认编码(GBK)。 - 编译阶段:`javac.exe`编译.java文件,此时源代码的GBK编码不影响...

    java中文乱码问题

    今天,我们将从编码角度分析 Java 编译后在控制台和 Web 等终端显示乱码问题。 一、 Java 处理字符的原理 Java 使用 UNICODE 来存储字符数据,处理字符时通常有三个步骤:按指定的字符编码形式,从源输入流中读取...

    java中文乱码解决之道(4)java编码转换过程Java

    在Java编程语言中,中文乱码问题是一个常见的挑战,特别...以上内容涵盖了Java编码转换的基本原理和处理乱码问题的关键点,希望对Java开发者有所帮助。在实际工作中,遇到具体问题时,还需结合实际情况进行分析和调试。

    java中文乱码解决问题

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

    Java源码编码转换器 v2.0 GBK TO UTF8

    Java源码编码转换器v2.0是一款专用于解决Java源码编码问题的工具,它主要功能是将GBK编码的Java文件转换成UTF-8编码,以解决由于编码不匹配导致的乱码问题。该工具在之前的版本基础上进行了优化,修复了UTF-8转换后...

    java字符串的各种编码转换

    根据提供的文件信息,本文将详细解释Java中字符串的不同编码转换方法及原理,并深入探讨每种编码格式的特点。 ### Java字符串的编码转换 在Java中,处理不同字符集之间的字符串转换是一项常见任务。尤其是在处理...

    java编码格式转换

    ### Java编码格式转换 在Java开发中,字符编码的转换是一项常见的需求,尤其是在处理国际化文本时。本文将详细介绍如何在不同的编码格式之间进行转换,并探讨一些常见的编码转换错误及其处理方法。 #### Unicode与...

    java字符串编码转换

    ### Java字符串编码转换详解 #### 一、Java 字符串编码转换基础 在Java中,字符串的处理是非常常见的操作之一,而字符编码是确保数据正确显示的关键因素。本篇文章将重点介绍Java中字符串编码的转换方法及其在Web...

    java文件的编码转换

    GBK是中国大陆广泛使用的中文编码标准,包含了大量的汉字,而UTF-8是一种国际通用的编码,支持全球多种语言,包括中文。 在Java中,我们可以使用`java.nio`包中的`Charset`、`Files`和`Paths`类来读取、写入和转换...

    关于java中的编码转换问题(解决乱码问题)

    乱码问题通常是由于编码不一致或不当转换导致的。以下将详细阐述Java中涉及编码转换的关键知识点。 一、概念 1. 字符: 字符是文本的基本单位,可以是字母、数字、标点符号或其他符号。在计算机内部,字符通常通过...

    java文件编码转换

    Java写的一个小程序,用于批量转换GBK编码的java源文件为UTF-8编码格式

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

    总的来说,解决Java中的中文乱码问题需要从多方面考虑,包括文件操作、网络通信、数据库交互、IDE配置、字符串转换等多个环节。理解字符集的概念,合理设置编码,是避免乱码的关键。在实际开发中,养成良好的编码...

    java文件字符编码检测和转换

    附件中:FileCharsetConverter.java 此文件可以实现两个编码的相互转换 FileCharsetConverter.convert( "gbk/DispatcherHandler.java", "GBK", "UTF-8", new FilenameFilter() { public boolean accept(File...

Global site tag (gtag.js) - Google Analytics