JAVA语言中对字符串取 .getByte 的时候,如果未指定编码格式,则默认集成当前 .java 文件的编码格式。
即:
当前的 .java 文件是 UTF-8编码,那么 .getByte即 .getByte("UTF-8")
当前的 .java 文件是 GBK 编码,那么 .getByte即 .getByte("GBK")
那么,如果 .getByte 在已经生成的 .class 文件,编码格式是怎样的?
我们用GBK编码和UTF-8编码来验证这个问题,我们都知道,一个中文的字符,GBK编码是2byte,UTF-8编码是3Byte,然后做
一个简单的例子:
创建一个类文件,默认是UTF-8编码,然后将其达成jar包。
然后在另外的工程中调用接口,工程的编码格式是 UTF-8 :
可以发现输出“中国” 是6个字节,UTF-8编码。
将当前的 TetUTF8.java修改成 GBK编码(工程仍然是UTF-8编码),然后再测试。
可以看到输出的是4个字节,这个还是GBK编码,所以说,JAR包中的编码还是和当前调用此接口的.java文件一致。
那么如果,我们当前的项目是UTF-8编码,但是我们需要调用这个接口,让其内部的编码变成 GBK ,是否可以通过修改当前调用类的编码实现呢?
在当前的类中,再封装一个接口,然后我们在新建一个TestGBK.java
在TestUTF8.java中,新建一个函数 UTF8_To_GBK(String info ) 调用testBase64,当然
TestUTF8.java 是 GBK 编码
TestGBK.java 是UTF-8编码,这个类模拟我们当前的项目是UTF-8编码。
下面是输出的结果:
可以看到,输出的结果,仍然都是UTF-8编码。
如果通过 new String("中国".getBytes("UTF-8"),"GBK")) ; 编码,得到的结果仍然不是我们想要的: D6D0B9FA ,而是另外一个9字节的值,这是因为 UTF-8 是3个字节表示一个字符,GBK是2字节表示一个字符,这是因为:
中国 -> UTF-8 -> 6字节数据 -> GBK -> 3个中文字符 -> UTF-8 -> 9字节数据
结论:
当前的 .java 文件是 UTF-8编码,那么 .getByte即 .getByte("UTF-8")
当前的 .java 文件是 GBK 编码,那么 .getByte即 .getByte("GBK")
.class文件中的 .getByte 默认编码也是跟随最终调用的.java文件,和中间层的.java编码格式无关。
注: 本文测试环境为 Eclipse + JDK1.8