遇到了一个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"