`

java的内部字符编码

阅读更多
转自:http://singleant.iteye.com/blog/686383
本周遇到一个java乱码问题,于是对java的编码问题做了一些实验和了解。简单分析如下:

先看下如下代码:
Java代码 
import java.io.UnsupportedEncodingException;  
 
public class CharSetTest {  
 
public static void main(String[] args) throws UnsupportedEncodingException {  
 
String test = " 篮球 " ;  
 
byte [] defaultResult = test.getBytes();  
 
for ( byte e : defaultResult) {  
 
System. out .print(e + " " );  
 
}  
 
System. out .println(System. getProperty ( "file.encoding" ));  
 
System. out .println( "test=" + test);  
 
}  
 
}  



1.执行 javac CharSetTest.java,能正常编译,但是得到如下警告:
CharSetTest.java:5: warning: unmappable character for encoding ASCII
        String test = "????";
分析一下为什么会这样呢?对于java编译器来说,CharSetTest.java就是一个文本文件,java编译器要解析这个文本文件并编译生成.class文件。分析了下原因大概是这样的:CharSetTest.java一定是以某一种编码格式来存储的,所以java编译器一定要知道该文本文件时用什么来编码的,如果没有指定就用默认认为文件的编码格式是” ANSI_X3.4-1968”(不同环境可能不一样),所以就会发现无法解释的中文而出现了乱码。
那么以上问题该如何解决,就是要在编译的时候告诉编译器,需要编译的java文件的编码格式,否则编译器有可能遇到不能理解的字符就当做乱码处理了。由于 CharSetTest.java是GBK格式的,所以通过如下命令完成:
Javac CharSetTest.java –encoding=GBK。

2. 通过执行Javac CharSetTest.java –encoding=GBK,已经能得到正确的class文件了,但是执行 java  CharSetTest,结果如下:
63 63 ANSI_X3.4-1968
test=??
那么既然已经正确编译了,为什么得到的输出结果还会是乱码呢?前面已经可以肯定.class文件里面存放的中文字符串是正确的了,那原因肯定是在JVM 从.class文件读取这个字符串字节流并构建String对象的时候采用了错误的字符编码来构建字节流。进而导致从JVM输出字符串的字节流到我们控制台的时候,出现乱码。那么很显然,我们必须告诉jvm我们控制台的编码,或者我们希望它采用什么字符编码来构建字节流。如果没有告诉jvm,那么文件的编码格式是” ANSI_X3.4-1968”(不同环境可能不一样)。
假设我们控制台是GBK的编码,那么只要我们正确告诉它,它就能正确的返回字节流了。那么原因就比较简单,我们没有正确告诉JVM我们需要它构造字符串输出流的时候应该采用的编码格式。那么该如何处理呢?通过如下命令:
java -Dfile.encoding=GBK CharSetTest
得到结果:
-64 -70 -57 -14 GBK
test=篮球
以上试验是在linux环境上面做的。在eclipse下面并不会成立,因为eclipse会帮我们做一些判断。同时不同的操作系统环境可能也不一样。

最后总结:
Java的class文件采用UTF-8,在JVM里面采用UTF-16。整个过程中编码转换大概可以看下图:






从上图可以理解不管采用那种格式的源文件,只要正确告诉编译器,编译器就会得到正确的结果。同时只要告诉JVM正确的输出流需要的编码格式,JVM总会返回正确编码格式的输出流。


那么要想不产生乱码要注意两个环节:
1.    告诉编译器你的源文件编码。
2.    告诉jvm你显示或者构造字符串输出流时希望的编码。
尤其JSP乱码时要注意request请求采用的编码和解析request时候采用的编码是否一致,response的编码和html charset的编码是否一致。

同时我们常遇到jsp、数据库等乱码问题可以找一下是否是以下两种原因:
1.    误解型:a文件是GBK编码,但是你以为是UTF-8型编码,所以用UTF-8来理解它,就会出现乱码。
2.    无能为力型:a文件时GBK编码,你也知道它是GBK编码,但是你想转换成ISO-8859-1的方式来显示,但是GBK里面有很多字符时ISO- 8859-1所不能解释的,这时也会出现乱码。
  • 大小: 34.9 KB
分享到:
评论

相关推荐

    JAVA字符编码问题总结

     上个世纪60年代,美国制定了一套字符编码,对英语字符与二进制位之间的关系,做了统一规定。这被称为ASCII码,一直沿用至今。  ASCII码一共规定了128个字符的编码,比如空格“SPACE”是32(二进制00100000),...

    java中文编码问题

    java编程中字符编码问题,包括java源代码文件的字符集,.class文件的字符集,以及jVM内部的字符集编码等等。

    字符编码学习

    上个世纪60年代,美国制定了一套字符编码,对英语字符与二进制位之间的关系,做了统一规定。这被称为ASCII码,一直沿用至今。 ASCII码一共规定了128个字符的编码,比如空格“SPACE”是32(二进制00100000),大写...

    Java 实现哈夫曼编码(源代码)

    哈夫曼编码(Huffman Coding)是一种基于字符出现频率的变长编码方式,常用于数据压缩。哈夫曼编码的原理是构建一棵哈夫曼树(Huffman Tree),也称为最优二叉树,树的每个叶子节点表示一个字符,字符的频率(或权重...

    Neusoft公司Java编码规范

    Neusoft公司Java编码规范 目的 5 范围 6 前提条件 7 Java编码规范概要 8 1 代码风格 8 1.1 一般格式说明 8 1.2 基本结构 8 2 代码结构 9 2.1 变更履历 9 2.2 Package声明 11 2.3 Import声明 12 2.4 Class Header 13 ...

    Java程序设计基础:字符数据类型.pptx

    字符内部Unicode字符编码,占2个字节,可表示0~216-1(65535)个字符,通常用一对单引号引用,如:‘a’,‘5’等。 字符数据类型(char) ASCII 码是 Unicode 码的一个子集,用 Unicode 表示 ASCII 码时,可表示其前...

    java学习资料

    第一章Unix Day01:UNIX 介绍和基本指令 Day02:UNIX 指令(二)和...Day12:String 类和字符编码介绍 Day13:正则表达式和包装类 Day14:java 的内部类 Day15:java 的集合类 Day16:java 的异常处理 Day17:Swing 介绍

    java源码包---java 源码 大量 实例

     Java zip压缩包查看程序,应用弹出文件选择框,选择ZIP格式的压缩文件,可以像Winrar软件一样查看压缩文件内部的文件及文件夹,源码截图如上所示。 Java 数字签名、数字证书生成源码 2个目标文件 摘要:JAVA源码,...

    JAVA_API1.6文档(中文)

    java.nio.charset 定义用来在字节和 Unicode 字符之间转换的 charset、解码器和编码器。 java.nio.charset.spi java.nio.charset 包的服务提供者类。 java.rmi 提供 RMI 包。 java.rmi.activation 为 RMI 对象...

    java源码包4

     Java zip压缩包查看程序,应用弹出文件选择框,选择ZIP格式的压缩文件,可以像Winrar软件一样查看压缩文件内部的文件及文件夹,源码截图如上所示。 Java 数字签名、数字证书生成源码 2个目标文件 摘要:JAVA源码...

    JAVA上百实例源码以及开源项目源代码

     Java zip压缩包查看程序,应用弹出文件选择框,选择ZIP格式的压缩文件,可以像Winrar软件一样查看压缩文件内部的文件及文件夹,源码截图如上所示。 Java 数字签名、数字证书生成源码 2个目标文件 摘要:JAVA源码,...

    JAVA上百实例源码以及开源项目

     Java zip压缩包查看程序,应用弹出文件选择框,选择ZIP格式的压缩文件,可以像Winrar软件一样查看压缩文件内部的文件及文件夹,源码截图如上所示。 Java 数字签名、数字证书生成源码 2个目标文件 摘要:JAVA源码,...

    华为 java 安全 编码 规范 安全篇 2.0

    规则 1.5 从格式化字符串中排除用户输入 规则 1.6 禁止向Runtime.exec() 方法传递不可信、未净化的数据 规则 1.7 验证路径之前应该先将其标准化 规则 1.8 安全地从ZipInputStream提取文件 规则 2.1 不要抑制或者忽略...

    java源码包3

     Java zip压缩包查看程序,应用弹出文件选择框,选择ZIP格式的压缩文件,可以像Winrar软件一样查看压缩文件内部的文件及文件夹,源码截图如上所示。 Java 数字签名、数字证书生成源码 2个目标文件 摘要:JAVA源码...

    Java 1.6 API 中文 New

    java.nio.charset 定义用来在字节和 Unicode 字符之间转换的 charset、解码器和编码器。 java.nio.charset.spi java.nio.charset 包的服务提供者类。 java.rmi 提供 RMI 包。 java.rmi.activation 为 RMI 对象激活...

    java源码包2

     Java zip压缩包查看程序,应用弹出文件选择框,选择ZIP格式的压缩文件,可以像Winrar软件一样查看压缩文件内部的文件及文件夹,源码截图如上所示。 Java 数字签名、数字证书生成源码 2个目标文件 摘要:JAVA源码...

    Servlet 中文乱码解决工具类

    在Java Web程序开发中,由于Web容器内部使用编码格式并不支持中文字符集,所以,处理浏览器请求中的中文数据就会出现乱码的现象。由于Web容器使用了ISO-8859-1的编码格式,所以在Web应用的业务处理中也会使用ISO-...

    Java开发详解.zip

    031216_【第12章:JAVA IO】_字符编码笔记.pdf 031217_【第12章:JAVA IO】_对象序列化笔记.pdf 031218_〖第12章:JAVA IO〗_实例操作—单人信息管理程序笔记.pdf 031219_〖第12章:JAVA IO〗_实例操作:投票程序...

    java jdk实列宝典 光盘源代码

    12反射 是java程序开发的特征之一,允许java程序对自身进行检查,并能直接操作程序的内部属性; instanceof操作符,instanceof.java; 获取类的信息,ViewClassInfoJrame.java; 动态调用类的方法,CallMetod.java; ...

Global site tag (gtag.js) - Google Analytics