得,今天又折腾个小东西,叫`native2ascii`。也不是啥新鲜玩意儿,JDK自带的一个小工具,估计好多人都用过或者听说过。我这边,是最近处理一个老项目的配置文件,遇到点编码问题,正好就想起来它,顺手记录一下过程。
事情是这样的,我接手一个有点年头的Java项目,里面有些配置文件,就是那种`.properties`结尾的,存些界面上显示的中文信息。结果,在本机开发环境跑得好好的,一部署到服务器上,好家伙,中文全变成问号或者乱码。一看就是编码没对上。
找问题根源
稍微琢磨下,`.properties`文件默认是按`ISO-8859-1`编码读取的,这编码它不支持中文。那咋办?直接把文件改成`UTF-8`?试下,好像有时候行,有时候又不行,特别是在不同的环境和工具链下面,总感觉不太稳妥。
想起老工具
这时候,我就想起以前用过的一个土方法,就是用JDK自带的`native2ascii`工具。这工具就是干这个的,把你的文件里那些非`ASCII`字符(比如咱们的中文)给你转换成`Unicode`转义序列,就是那种`\uXXXX`格式的。这样一来,文件本身就全是`ASCII`字符,不管啥环境,用`ISO-8859-1`读都没问题,Java运行的时候又能正确识别这些`\uXXXX`转义符,把中文显示出来。
动手开干
说干就干。得找到这个工具在哪。我记得它就在JDK安装目录的`bin`文件夹下面。打开我的电脑,找到JDK的安装路径,果然,`*`静静地躺在那儿。
为方便使用,我先检查下我的环境变量`Path`里有没有包含JDK的`bin`目录。确认有之后,就可以直接在命令行里敲`native2ascii`。
接下来就是具体操作:
- 先把我那个有中文的配置文件,比如说叫`messages_zh_*`,备份一下,这是好习惯。
- 然后打开命令行窗口(我用的是Windows的CMD)。
- 输入命令。它的基本用法大概是这样:`native2ascii [选项] [输入文件] [输出文件]`。
- 我就直接敲:`native2ascii messages_zh_* messages_zh_CN_*`。
这里没指定啥特殊选项,它默认就是把`messages_zh_*`里的本地字符(我的系统默认是GBK,或者你文件本身是UTF-8也行)转成Unicode转义,然后输出到`messages_zh_CN_*`这个新文件里。
检查结果
命令执行很快,没报错。我赶紧打开那个新生成的`messages_zh_CN_*`文件看看。果然,里面原来的中文,比如“用户名”,现在变成`\u7528\u6237\u540d`这样的形式。这就对!
替换验证
然后,我把项目里原来的`messages_zh_*`文件替换成这个新生成的`messages_zh_CN_*`文件(文件名可能得改回去,或者配置里指定加载这个新的)。重新编译、部署、启动服务。
再次访问界面,中文显示正常!问题解决。
反向操作也试试
有时候我们可能需要编辑这种转义后的文件,看`\uXXXX`肯定不方便。`native2ascii`也能反过来用。加个`-reverse`参数就行。
我又试下:`native2ascii -reverse messages_zh_CN_* messages_zh_CN_*`。
打开`messages_zh_CN_*`,里面的`\uXXXX`又变回可读的中文。这样以后要修改配置的话,可以先转回来,改完再转过去,也还算方便。
一点感想
`native2ascii`这工具虽然老,但在处理这种`.properties`文件中文乱码问题上,还是挺直接有效的。现在很多IDE或者框架可能都内置处理这些编码问题,我们可能不怎么需要手动去调用它。但解一下,知道JDK里有这么个东西,万一哪天碰上类似的老系统或者特殊场景,也能多个解决思路。实践下来感觉就是,简单、直接、管用。分享给大家,算是个小小的实践记录。