今天周末,而且练车挺愉快的,所以吃完晚饭就开始捡起最近鸽的项目。(我应该19点就吃完饭了,然后搞到22:30左右)
其实一些东西我在之前的自习课上就搞的差不多了,今晚只需要按部就班搞一下就成了,
谁知道项目从单独类移植到Tomcat项目下的时候突然出现了编码的问题,不管是gbk、utf-8、Unicode以及gb2312
通过sendGet.getBytes("xxx"),"xxx"来进行调换,都会插那么一点,要么不是部分中文乱码要么就是特殊表情无法显示。
脑壳疼哦。
然后就在想会不会是Javaweb项目的默认编码问题(之前吃过这个亏)
然后打印Charset.defaultCharset(),main方法下是UTF-8,而Tomcat下调用其他方法是GBK(鬼知道为啥不是ISO-8859-1)
因为之前是测试成功的,所以就想方设法往测试环境上靠拢
那是一个脑壳疼哦!!!
整了几个小时哇,搞不好哇,然后就从多次百度的情况下结合实际去深入了解了一下底层原因。

java Charset.defaultCharset()的介绍

说明
返回此 Java 虚拟机的默认 charset。默认 charset 在虚拟机启动时决定,通常根据语言环境和底层操作系统的 charset 来确定。

Charset.defaultCharset()是操作系统的编码,可以通过虚拟机启动时指定属性-Dfile.encoding=UTF-8,来更改Charset.defaultcharset().
Charset.defaultcharset()指的是jvm输入流、输出流默认使用的编码/解码方式。

规则
当我们需要指定编码格式,可以通过JVM参数在启动的时候进行设置-Dfile.encoding=XXX,从而不受操作系统和语言环境的影响.
获取默认编码格式的源码如下:
①当我们不手动设置JVM参数-Dfile.encoding时,系统默认字符集则取决于语言环境和底层操作系统(Windows的CMD下是GBK,Linux下则跟设置的语言环境有关)
②当我们手动设置JVM参数-Dfile.encoding=xxx,如果xxx是不支持的字符集,则默认使用’UTF-8’编码.
我竟然会去看源码(震惊脸)
我竟然会去扒代码
注意:
看到上面说可以通过设置系统属性file.encoding来设置默认字符集,那么有些朋友就想通过在运行时,通过System.setProperty("file.encoding", "GBK");来动态改变字符集,虽然可以通过System.setProperty("file.encoding","GBK")修改属性值,但仅仅是修改了file.encoding这个属性值,并不会影响Charset.defaultCharset()。因为jvm启动时就已经设置了Charset.defaultcharset().

作用
Charset.defaultcharset就是“操作系统编码”它会影响java 输入流、输出流默认的编码解码。
比如在StreamEncoder解码流中默认就是使用的Charset.defaultcharset()

file.encoding与Charset.defaultCharset()的关系
可以通过在JVM启动时通过设置-Dfile.encoding=UTF-8来设置Charset.defaultCharset()的值.
注意: 仅在JVM启动时能指定Charset.defaultCharset()的值,在运行时通过System.setProperty("file.encoding","XXX")修改属性,仅仅是修改了file.encoding这个属性值.

接下来就算附上我的解决方式了

  1. 修改环境变量 (变量名:JAVA_TOOL_OPTIONS变量值:-Dfile.encoding=UTF-8)
    我之前的环境变量是直接在path贴的bin路径,所以这个不适合我用
  2. tomcat中修改:修改catalina.bat,添加如下启动参数(-Dfile.encoding=UTF-8)
    你可能不信,没找到详细方法,俺怕搞错
  3. D:Toolsapache-tomcat-7.0.96bin(找你自己的tomcat/bin目录),新建setenv.bat,编辑入

set "JAVA_OPTS=%JAVA_OPTS% -Dfile.encoding=UTF8"

然后重新启动就好了。
黄天不负有心人啊,反正我是搞好了。打印出来UTF-8真是满满的感动啊
学习的快乐。
by:只是嘴里嚷嚷爱学习的小苏