http代理服务器(十五)字符集

背景:

idea启动没问题,dos启动中文乱码

 

排查:

1 出现乱码的网站,为utf-8,有HostRemoveResponseModifier,而代码在修改response过程中,并未指定字符集,在idea下默认可能为utf-8,在dos下就不知道了,所以猜测应该是Modifier时字符错乱

证明:删除HostRemoveResponseModifier后dos访问正常

 

2

https://blog.csdn.net/u011479200/article/details/83115159

当我们不手动设置JVM参数-Dfile.encoding时,系统默认字符集则取决于语言环境和底层操作系统(Windows的CMD下是GBK,Linux下则跟设置的语言环境有关

 

解决:

1 -Dfile.encoding=UTF-8,有用

2 System.setProperty("file.encoding","UTF-8") ,有用

 

 

 

其它知识

文中说:

看到上面说可以通过设置系统属性file.encoding来设置默认字符集,那么有些朋友就想通过在运行时,通过System.setProperty("file.encoding", "GBK");来动态改变字符集,虽然可以通过System.setProperty("file.encoding","GBK")修改属性值,但仅仅是修改了file.encoding这个属性值,并不会影响Charset.defaultCharset()。因为jvm启动时就已经设置了Charset.defaultcharset().

做个实验 dos jre1.8

System.setProperty("file.encoding","UTF-8");
System.out.println(Charset.defaultCharset());

输出UTF-8

System.out.println(Charset.defaultCharset());
System.setProperty("file.encoding","UTF-8");
System.out.println(Charset.defaultCharset());

输出

windows-1252
windows-1252

 

结论:

1 在当前环境下,只要setProperty在首次Charset.defaultCharset调用前,即可修改

2 在其它环境下或其它jvm下,1的结论具有不稳定性

3 在复杂项目下,1的结论具有不稳定性,因为你不知道哪里或者哪个三方包先调用了Charset.defaultCharset

4 更严谨的,应当在new String和getBytes时显式指定字符集

 

posted on 2023-08-06 00:23  silyvin  阅读(28)  评论(0)    收藏  举报