项目中,有些业务数据存放在blob类型的字段中,常遇到的一个问题就是中文乱码。本人参与的一个项目,在windows环境下,中文正常显示,有一天切换到了Linux服务器上,同样的代码,竟然出现了中文乱码。乱码并不可怕,解决方式无非是统一编码。于是乎,先查看了一下用的Oracle数据库的字符集

 

select * from nls_database_parameters where parameter ='NLS_CHARACTERSET';

查询结果是ZHS16GBK,也就是对应GBK编码。又在网上查了下资料,说windows默认GBK编码,Linux默认UTF-8,怪不得在window环境下没事,Linux环境下就乱码了。问题原因搞清楚了,下一步着手解决。 

是改数据库编码呢还是改服务器编码呢?分析了下,Oracle改默认编码很麻烦而且还可能有隐患,并且我的项目还跟别的项目共用一个数据库,安全起见还是改服务器编码吧。 

Linux系统版本:CentOS release 6.9 (Final)

先输入命令:locale 

果然都是UTF-8,尝试了下面方法:


/root/.bash_profile文件的末尾添加以下两行命令:

export LC_ALL="zh_CN.GBK"
export LANG="zh_CN.GBK"

重新启动服务器后,重新输入命令:locale

 

 很高兴的发现都变成了GBK,以为搞定了,结果做了下测试还是乱码,百思不得其解。又试了些别的法,也不行,无奈先在项目启动后追加些打印环境编码的代码看看吧:

System.out.println("Default Charset=" + Charset.defaultCharset());
System.out.println("file.encoding=" + System.getProperty("file.encoding"));
System.out.println("Default Charset=" + Charset.defaultCharset());
System.out.println("Default Charset in Use=" + getDefaultCharSet());

private static String getDefaultCharSet() {
    OutputStreamWriter writer = new OutputStreamWriter(new ByteArrayOutputStream());
    String enc = writer.getEncoding();
    return enc;
}

 

 

果然,打印出来的结果还是UTF-8

又找了个方法试了试:

修改 /etc/sysconfig/i18n 文件
修改为:
LANG="zh_CN.GBK"
SUPPORTED="zh_CN.UTF-8:zh_CN:zh"
SYSFONT="latarcyrheb-sun16"

修改完后,执行:source i18n,再测试,成功解决。本以为这样的问题都能这么解决的,后来在公司的开发服务器上又试了一把,结果不好使。

公司服务器版本:Red Hat Enterprise Linux Server release 6.4 (Santiago)

最后又用了下面的方法:

在/etc/profile文件的最后一行添加如下内容:

export LANG="zh_CN.GBK"
export LC_ALL="zh_CN.GBK"

问题解决了。

总结,不同的情况多试试,不行就打印出运行环境的编码方式看看。

GitHub 加速计划 / li / linux-dash
6
1
下载
A beautiful web dashboard for Linux
最近提交(Master分支:3 个月前 )
186a802e added ecosystem file for PM2 4 年前
5def40a3 Add host customization support for the NodeJS version 4 年前
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐