前几天一台内网服务器从ubuntu迁移到了centos,检查一切正常后就没有太在意。
今天有同事反馈迁移后的机器上的服务一个缓存总是无法获取,对比了下环境、JVM参数,尝试了war包替换等方式照样复现。
在有问题的机器上装了redis-cli让同事去看也是可以获取到的,一时没有了头绪。
打算请教其他同事,让有问题的同事把查询等发我一下,然后就看到了… …. key设置为了中文,一下子头大了… …
检查机器的locale都没什么问题:
1 | $ env |grep LANG |
但用jinfo查看centos那台后发现被设置为了ANSI… …
1 | file.encoding = ANSI_X3.4-1968 |
代码里一检查果然代码里没有设置charset使用了默认的,默认的获取规则:
1 | public static Charset defaultCharset() { |
加上file.encoding之后就可以了…
这也暴露了两个问题,一个是代码依赖了默认编码,另一个是服务器的JVM参数设置不全面,没覆盖常见的场景。
还有最重要的一点…凡是用中文做key的都应该被烧死!!!!!!!
感觉又虚度了光阴。
UPDATE 2018/07/09
迁了docker之后发现生成的文件也乱码了,变成了???…后来一看是LOCALE设置的问题
只需要加上(zh_CN用的image不支持..):
1 | ENV LANG en_US.UTF-8 |
就好了