遇到了一个HttpURLConnection乱码问题:结果是JVM file.encoding错误

这个问题定位了挺久,写下来mark下。

起因:由于调用A系统接口,使用HttpURLConnection,请求的ContentEncoding和Charset.defaultCharset().name()
,一直是us-ascii或在是MacRoman等等,一直乱码,看了下Charset.defaultCharset().name()是由用file.encoding 决定的,

Charset.defaultCharset().name()的实现如下:

public static Charset defaultCharset() { 
if (defaultCharset == null) { 
synchronized (Charset.class) { 
java.security.PrivilegedAction pa = 
new GetPropertyAction("file.encoding"); 
String csn = (String)AccessController.doPrivileged(pa); 
Charset cs = lookup(csn); 
if (cs != null) 
defaultCharset = cs; 
else 
defaultCharset = forName("UTF-8"); 
} 
} 
return defaultCharset; 
} 


在linux服务器中使用下面的check了下编码,结果是us-ascii,

Properties pps=System.getProperties();  
pps.getProperty("file.encoding");


修改file.encoding,在Tomcat JVM 启动参数里面加入

 在catalina.sh  中加一个  -Dfile.encoding=UTF-8

具体如下:

export JAVA_OPTS="-server -Xms256M -Xmx256M -Xss512k -XX:+AggressiveOpts -XX:+UseBiasedLocking -XX:PermSize=64M -XX:MaxPermSize=128M -XX:+DisableExplicitGC -XX:MaxTenuringThreshold=31 -XX:+UseConcMarkSweepGC -XX:+UseParNewGC  -XX:+CMSParallelRemarkEnabled -XX:+UseCMSCompactAtFullCollection -XX:LargePageSizeInBytes=128m  -XX:+UseFastAccessorMethods -XX:+UseCMSInitiatingOccupancyOnly -Djava.awt.headless=true -Dfile.encoding=UTF-8"



你可能感兴趣的:(遇到了一个HttpURLConnection乱码问题:结果是JVM file.encoding错误)