ITPub博客

首页 > 应用开发 > Java > JAVA与编码

JAVA与编码

原创 Java 作者:壹頁書 时间:2013-12-12 23:01:49 0 删除 编辑
JAVA很容易出现乱码...具体分析以下几个环节的编码。

1.编译
    JAVA源文件可能是GBK编码也可能是UTF8编码,使用javac命令编译的时候,会使用操作系统默认的编码编译文件。
    如果平台是windows,而源文件是UTF8编码,则遇到了第一个乱码问题。
    这时候可以使用javac命令的encoding选项,标明源文件的编码格式。
    经过编译之后,JAVA字节码文件以UTF8编码存储在class文件中。    
    
    -encoding <编码>             指定源文件使用的字符编码

2.运行
    JAVA在运行时,采用unicode编码,JAVA系统内部不存在乱码问题。
    但是输入输出还是依赖外部编码。默认使用操作系统的默认编码。
    也可以指定file.encoding参数。
    如果设置了file.encoding参数,System.in、System.out、string.getBytes()等都会使用这个设置的编码解析数据,否则使用平台的默认编码。
    
  1. public class Test {
  2.     public static void main(String[] args) {
  3.         String data="中文";
  4.         System.out.println(Charset.defaultCharset());
  5.         System.out.println(data);
  6.     }
  7. }
    平台是windows系统,默认编码为GBK,可以看到不同的file.encoding参数导致运行结果的不一样。


3.JDBC编码
    因为JAVA系统运行时采用unicode编码,如果数据库采用GBK或者utf8编码,则可能出现乱码问题。
    Oracle数据库采用唯一编码,oracle的jdbc会自动将unicode转换为目标Oracle数据库的编码。
    而Mysql可以同时使用多种编码,所以需要在Mysql JDBC的url中指定目标数据库的编码。

4.URL编码
    如果需要在URL中传输中文参数,除了JS两次编码的方式,也可以使用如下方式。

  1. public class Test {
  2.     public static void main(String[] args) throws UnsupportedEncodingException {
  3.         // 模拟浏览器将中文参数编码
  4.         String data = "%E4%B8%AD%E6%96%87%E8%AF%B7%E6%B1%82";

  5.         // 模拟Tomcat使用默认URIEncoding解码[ISO-8859-1]
  6.         data = URLDecoder.decode(data, "ISO-8859-1");
  7.         System.out.println(data);
  8.         
  9.         //模拟在doGet中获取参数
  10.         data=new String(data.getBytes("ISO-8859-1"),"utf8");
  11.         System.out.println(data);
  12.     }
  13. }
运行结果如下:
    ??????è?·?±?
    中文请求
    
    两次JS编码方式参见:http://blog.itpub.net/29254281/viewspace-775925/
    详细资料:http://blog.csdn.net/feihong247/article/details/7841237

5.关于指定编码
    无论是Spring的CharacterEncodingFilter还是request的setCharacterEncoding,都是为byte[]指定解码的规则,而不是转换。

  1. public class Test {
  2.     public static void main(String[] args) throws UnsupportedEncodingException {
  3.         byte[] data = "中".getBytes("utf8");
  4.         System.out.println(new String(data, "utf8"));
  5.         System.out.println(new String(data, "gbk"));
  6.         //运行结果:
  7.         //中
  8.         //涓?
  9.     }
  10. }


来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/29254281/viewspace-1063133/ ,如需转载,请注明出处,否则将追究法律责任。

上一篇: 创建Linux服务
请登录后发表评论 登录
全部评论

注册时间:2013-10-19

  • 博文量
    620
  • 访问量
    6339852