java编译编码问题 博客分类: java java
程序员文章站
2024-03-14 11:54:04
...
最近由一个编码问题。让我对另一个编码问题产生了疑惑。
即我们在写java源文件的时候一般使用的是utf-8编码,但是tomcat控制台(直接在bin里面启动的那个黑窗口)编码是gbk.为什么tomcat控制没有乱码问题?
最开始我想的是既然我的java源文件是按照utf-8编码,那么最后必须按照utf-8解码才不会有问题啊。为什么tomcat用gbk解码没有乱码问题?
然后查了下javac编译过程:
当javac编译的时候会根据-Dfile.encoding参数来进行编译,-Dfile.encoding,一般为系统默认字符,windows下为gbk。当我们在ecplise下编写文件的时候,一般我们会设置编码为utf-8,所以编译的时候会以utf-8编译。
重点来了:java编译采用的编码是unicode编码,所以这里面有一个转码的过程。java源文件的编码转码为unicode。这里我做了一个实验:
分别修改java源文件的编码为gbk,和utf-8运行上面的代码会发现打印出来的unicode编码都是25105。可见java都是使用unicode编码来对源文件的编码。相当于unicode是一座桥梁。
然后就是打印输出到控制台。
当我们执行下面这段代码的时候到底是什么意思?
这句代码的意思是将unicode编码转化为utf-8编码。然后交由控制台去显示。
现在回到最开始的问题:为什么tomcat控制台没有乱码问题?
因为1、在编译源文件的时候,java会根据根据源文件的编码来用unicode编码。放在内存中。不管gbk还是utf-8.都会查找码表生成统一的unicode编码。
2、在控制台输出的时候,java会根据当前-Dfile.encoding参数进行转化,在windows上该编码为gbk,所以java会将unicode编码转化为gbk,然后tomcat控制台用的gbk解码。所以没有乱码问题。
换言之:对java来说,我们不用考虑那么多,只要保证调用String.getBytes("编码")这句代码使用的编码和最终用来解码的编码一致即可。
即我们在写java源文件的时候一般使用的是utf-8编码,但是tomcat控制台(直接在bin里面启动的那个黑窗口)编码是gbk.为什么tomcat控制没有乱码问题?
最开始我想的是既然我的java源文件是按照utf-8编码,那么最后必须按照utf-8解码才不会有问题啊。为什么tomcat用gbk解码没有乱码问题?
然后查了下javac编译过程:
当javac编译的时候会根据-Dfile.encoding参数来进行编译,-Dfile.encoding,一般为系统默认字符,windows下为gbk。当我们在ecplise下编写文件的时候,一般我们会设置编码为utf-8,所以编译的时候会以utf-8编译。
重点来了:java编译采用的编码是unicode编码,所以这里面有一个转码的过程。java源文件的编码转码为unicode。这里我做了一个实验:
public static void main(String[] args) { System.out.println((int)'我'); }
分别修改java源文件的编码为gbk,和utf-8运行上面的代码会发现打印出来的unicode编码都是25105。可见java都是使用unicode编码来对源文件的编码。相当于unicode是一座桥梁。
然后就是打印输出到控制台。
当我们执行下面这段代码的时候到底是什么意思?
String a = "您好"; byte[] bytes = a.getBytes("utf-8");
这句代码的意思是将unicode编码转化为utf-8编码。然后交由控制台去显示。
现在回到最开始的问题:为什么tomcat控制台没有乱码问题?
因为1、在编译源文件的时候,java会根据根据源文件的编码来用unicode编码。放在内存中。不管gbk还是utf-8.都会查找码表生成统一的unicode编码。
2、在控制台输出的时候,java会根据当前-Dfile.encoding参数进行转化,在windows上该编码为gbk,所以java会将unicode编码转化为gbk,然后tomcat控制台用的gbk解码。所以没有乱码问题。
换言之:对java来说,我们不用考虑那么多,只要保证调用String.getBytes("编码")这句代码使用的编码和最终用来解码的编码一致即可。
推荐阅读
-
JVM垃圾回收历史 博客分类: java jvm
-
java编译编码问题 博客分类: java java
-
java for each循环的原理 博客分类: java
-
java static关键字的作用 博客分类: java static关键字
-
java生成zip包简单实现 博客分类: java java压缩java打包
-
java中判断字符串是否为数字的三种方法 博客分类: java java
-
Intellij IDEA 使用 java7 compiler to compile 转为java6 博客分类: Intellij IDEA
-
Error message: Selected class file name 'SomeFileName.java' mapped to not java f 博客分类: Intellij IDEA idea
-
java.util.concurrent介绍 博客分类: java 多线程java
-
java TimeZone 时区 博客分类: java utils