Java 编码转换

          Java使用unicode编码方式,最大程度的实现了多语言的支持。但是由于一些具体的原因,我们还需要了解Java编程中的编码处理方式,否则还会出现乱码的情况,有些情况下这个问题还很普遍。要注意的地方有以下几点:                1、本地文件编码与Java程序。         JDK javac命令编译.java文件时,如果不用-encoding参数指定.java文件的编码方式,则javac命令首先获得操作系统默认的编码格式 file.encoding(在程序中可以通过System.getProperty("file.encoding")得到这个默认值),把.java 文件从file.encoding编码格式转化为Unicode格式放在内存中,然后将Unicode格式转化为UTF-8格式,生成.class文件, 也就是这样一个编码转换过程:file.encoding—>Unicode—>UTF-8。当运行.class文件时,就将UTF -8格式的.class文件转化成Unicode格式读入内存,此时若需要用户输入,并且程序中没有指定输入字符串的编码格式,则系统会默认用 file.encoding格式将用户的输入转化成Unicode格式存入内存,在内存中运行后,若有字符需要输出,并且程序中也没指定输出的编码格式, 则系统会默认将需要输出的字符从Unicode转化成file.encoding格式进行输出。.class中的字符是这样一个编码转化过程:UTF-8 —> Unicode—> file.encoding;输入的字符是这样一个转化过程:file.encoding—> Unicode—> file.encoding。一般情况下,我们在某个平台下编辑.java文件,保存的时候是使用系统默认编码方式(file.encoding),编译 时转化为unicode,最后以UTF-8存储.class,当运行它并产生输出时,又会有个反向的转化过程,不会出现乱码。但是在我们以非默认 file.encoding方式保存.java文件时,或者在另外一个系统输出而这个系统的默认file.encoding又和前一个不同时,java 进行错误的字符编码转换,就会产生乱码问题。要想达到我们的目的,我们必须将每一处的file.encoding特别指定。 例如: import java.io.*; public class Test{ public static void main(String[] args){   try{     //写字符时指定编码,javac会实现GBK -> unicode的转换,无论系统默认file.encoding     BufferedWriter out=new BufferedWriter(new OutputStreamWriter(System.out,"GBK"));     out.write("请输入字符串:/n");     out.flush();     //读时指定输出编码,java会实现unicode -> GBK的转换,无论系统默认file.encoding     BufferedReader in=new BufferedReader(new InputStreamReader(System.in,"GBK"));     String s=in.readLine();     out.write("您输入的字符串是:"+s);     out.flush();     in.close();     out.close();   }catch(Exception e){} } } 编译时用以下方式: javac –encoding GBK Test.java      //实现了与本地系统编码无关。 这样无论在中文系统下还是在英文系统下都能得到正确的结果。 不指定-encoding也可以,不过需要用JDKnative2ascii命令将Test.java中的字符转化成Unicode格式,具体方法如下: native2ascii –encoding gbk Test.java Test1.java    //Java判断其为unicode编码后不转换?? 生成的Test1.java是我们需要的文件,将其改名为Test.java覆盖原Test.java即可。               2JSPServlet汉字处理。        .java程序有所不同,jsp程序是由web服务器编译执行的,具体过程是这样的:      1 web服务器编译jsp源文件时,搜索jsp文件中用<%@ page contentType="text/html;charset=Jsp-charset" %>或者<%@ page pageEncoding="Jsp-charset" %>指定的Jsp-charset,如果未指定,则取默认值,大多数web服务器的默认值是:ISO8859-1      2)以Jsp-charset编码方式解释jsp文件中出现的字符,并将其转化成Unicode编码,再转化成UTF-8格式,存为.java文件,编译生成.class文件。      3)运行.class文件,在服务器内部以Unicode格式对字符进行运算处理。      4)将运行后的结果转化为Jsp-charset格式输出到浏览器,并告诉浏览器该页面编码格式为Jsp-charset,如果未指定Jsp-charset,则同样取默认值,大多数web服务器的默认值是:ISO8859-1      5)浏览器收到结果,根据Jsp-charset自动选择对应的方式(

<meta http-equiv=content-type content="text/html; charset=gb2312">

)查看。如Jsp-charsetGBK,则浏览器自动以简体中文方式查看;如Jsp-charsetISO8859-1,则浏览器自动以西欧方式查看。 看一段简单的jsp代码:        <%             out.println("汉语");         %>         “汉语两个字的GBK编码为:0xBABAD3EF          对应的Unicode编码为:       0x6C498BED          UTF-8表示为:                 0xE6B189E8AFAD jsp源文件中指定Jsp-charsetGBK时,汉语的编码转化过程如下:          jsp源文件中为:                   0xBABAD3EF         .java.class文件中为:        0xE6B189E8AFAD          在内存中运行时为:             0x6C498BED          输出到浏览器时为:             0xBABAD3EF          浏览器根据Jsp-charset=GBK自动选择以简体中文方式查看结果,得到汉语的正确显示。当jsp 源文件指定Jsp-charsetISO8859-1时,汉语两个字在jsp源文件中的编码0xBABAD3EF,被当作ISO8859-1格式处 理,由于ISO8859-1是单字节编码的,因此转化成Unicode格式就成了:0x00BA00BA00D300EF,用UTF-8表示为: 0xC2BAC2BAC393C3AF。编码转化过程如下:          jsp源文件中为:                   0xBABAD3EF         .java.class文件中为:        0xC2BAC2BAC393C3AF          在内存中运行时为:             0x00BA00BA00D300EF          输出到浏览器时为:             0xBABAD3EF          浏览器根据Jsp-charsetISO8859-1自动选择用西欧方式查看结果,结果是0xBABAD3EFISO8859-1中对应的字符串 “ooó?”;如果手动改变浏览器的查看方式为简体中文,则能得到汉语的正确显示。当jsp源文件不指定Jsp-charset时,大多数服务器 默认Jsp-charsetISO8859-1,转化过程和指定Jsp-charsetISO8859-1相同。值得一提的是,把Jsp- charset指定为GBK和指定为ISO8859-1,只要浏览器以简体中文方式查看都能得到汉语的正确显示。这是因为在编译jsp源文件时, 是将字符编码格式从Jsp-charset转化成Unicode,当输出到浏览器时,又将Unicode转化成Jsp- charset,这两步是相互抵消的。有人可能会问:以上是将jsp源文件保存为GBK格式,如果将jsp源文件保存为其他格式,如UTF-8或是 ISO8859-1会是什么结果呢?其实过程原理是一样的,值得说明的是,普通的文本编辑器不能指定保存格式,当源文件中含有中文字符时它会自动保存为 GBK格式。有些高级IDE,如eclipse,能指定保存格式,但是当你将含有中文字符的jsp源文件保存为ISO8859-1时,它会提示你不能保 存,因为源文件中含有与ISO8859-1不兼容的字符,如果将含有中文的jsp源文件保存为UTF-8格式,则eclipse会自动将其中的中文字符转 化成Unicode,再转化成UTF-8格式保存,比如汉语保存为UTF-8格式为:0xE6B189E8AFAD          jsp源文件指定Jsp-charsetUTF-8时,此时如果jsp源文件是GBK格式的,则无论怎样都得不到正确的显示,只有将jsp源文件保存 UTF-8格式才能得到正确的结果,即一般必须正确指定jsp源文件的编码方式。某些情况下,比如实际是GBK,指定编码ISO8859-1也不会错。 UTF-8转化过程如下:          jsp源文件中为:               0xE6B189E8AFAD         .java.class文件中为:    0xE6B189E8AFAD          在内存中运行时为:         0x6C498BED          输出到浏览器时为:         0xE6B189E8AFAD 浏览器根据Jsp-charsetUTF-8自动选择用“Unicode(UTF-8)”方式查看结果,得到汉语的正确显示。               3HTML表单提交汉字处理。        有一个基本的事实是表单中的字符通过http协议传给服务器,http无一例外的使用ISO8859-1为传输对象的编码方式。因此客户端通过表单提交的字符数据到达服务器的时候是ISO8859-1编码,需要把它使用.getBytes("ISO-8859 -1","file.encoding")进行显示的转换才能正确的显示出来。如:      String username = new String (userLoginForm.getUsername().getBytes("ISO-8859 -1","gb2312";               4JDBC与数据库(MySQL为例)汉字处理。        在获得数据库连接的时候,需要指定以unicode方式处理字符,并且接收的字符是file.encoding编码的,即与jsp页面中的jsp-charset保持一致,或者.java文件的实际编码方式一致。如:         DriverManager.getConnection("jdbc:mysql://localhost/webstore?useUnicode=true& characterEncoding=gb2312","root", "");          mysql数据里设置字符集为GB2312.         create database webstore character set 'gb2312';                  create table `user` (         `user_id` INTEGER(11) NOT NULL AUTO_INCREMENT,         `user_name` VARCHAR(10) NOT NULL,         `user_password` VARCHAR(10) NOT NULL,         `user_level` INTEGER(1) NOT NULL,          PRIMARY KEY (`user_id`)) CHARACTER SET 'gb2312';

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值