之前用Java写的常驻进程服务,最近发现有个地方出现了乱码。出现乱码的位置是,程序调用了一个外部程序,通过管道读取外部程序的返回信息,然后加工这些返回信息。

排查了一下。手动调用外部程序没问题,Java编码没问题,文件权限等等都没问题。最后发现手动执行Java服务的时候不会出现乱码,而通过启动脚本启动的时候,就出现了乱码

百度了之后了解到通过外部程序调用启动脚本的时候,运行环境发生了改变,Shell环境已经不是用户环境了,这时候字符集的设置可能就变得不确定,可能变成了GB2312或ISO8859-1。

解决方法:

执行 echo $LANG ,获得当前环境的字符集,比如是 en_US.UTF-8 。之后在启动脚本中重新定义一下字符集就可以了:

1
export LANG=en_US.UTF-8

参考文献