`
Everyday都不同
  • 浏览: 713440 次
  • 性别: Icon_minigender_1
  • 来自: 宇宙
社区版块
存档分类
最新评论

一种解决在Linux环境下发送短信中文乱码问题的方案

阅读更多

这几天在折腾短信的发送问题。其实最令人苦恼的是,你明明在windows环境下一切都测试成功,能成功发送中文短信了,但偏偏你把项目部署到Linux环境的时候,却发现中文短信发出来是避之不及的乱码~~

其实能知道这是由于编码的问题,但要解决它还不太容易呢。

 

首先,看在windows环境下正常显示中文的原因:打开cmd窗口,输入:chcp你会发现输出

活动代码页: 936

查阅936的意义:它指明了当前系统使用的编码,936 代表GBK 扩展的EUC-CN 编码( GB 2312-80编码,包含 6763 个汉字)到Unicode (GB13000.1-93)中定义的20902个汉字,即中国大陆使用的是简体中文zh_CN。

这说明,在windows下是默认采用的gbk方式编码,短信也没有中文乱码。

 

接下来再看linux环境下的中文编码格式:输入命令

cat /etc/sysconfig/i18n

 你会发现输出默认为:

LANG="en_US.UTF-8"

SYSFONT="latarcyrheb-sun16"

这说明,Linux默认支持的中文编码为UTF-8,这与短信正常显示中文所支持的GBK不一致。

 

到这一步其实有2个思考方向,第一:修改短信发送的代码,在发送内容上修改成这样:

 smsContent = new String(smsContent.getBytes(), "gbk");

 参考String的编码解码说明:

public byte[] getBytes(String charsetName) 

使用指定的字符集将此String编码为byte序列,结果存在一个byte数组中

public String(byte[] bytes, String charsetName) 

通过使用指定的 charsetName 解码指定的 byte 数组,构造一个新的 String。

但经测试发现,在Linux上这样改动时,都无法收到短信网关的回复。。更别说中文乱码的问题了。

 

第二:修改Linux的中文编码。

执行命令:

vi /etc/sysconfig/i18n

 将内容替换如下:

LANG="zh_CN.GBK"
SUPPORTED="zh_CN.UTF-8:zh_CN:zh"
SYSFONT="latarcyrheb-sun16"

 修改保存后运行命令locale发现依然是utf-8编码格式。。

注意,此时不要着急reboot(linux重启系统命令,类似笔记本电脑重启系统,需要一段时间,有造成硬件损坏风险哦),将登陆用户先logout再login(登出后再登入),再次运行locale命令,你会发现被修改成GBK了:

LANG=zh_CN.GBK
LC_CTYPE="zh_CN.GBK"
LC_NUMERIC="zh_CN.GBK"
LC_TIME="zh_CN.GBK"
LC_COLLATE="zh_CN.GBK"
LC_MONETARY="zh_CN.GBK"
LC_MESSAGES="zh_CN.GBK"
LC_PAPER="zh_CN.GBK"
LC_NAME="zh_CN.GBK"
LC_ADDRESS="zh_CN.GBK"
LC_TELEPHONE="zh_CN.GBK"
LC_MEASUREMENT="zh_CN.GBK"
LC_IDENTIFICATION="zh_CN.GBK"
LC_ALL=

 

但此时你有可能发现打印的日志又乱码了,憋着急,不是说你的系统不支持gbk显示,而是你要修改你ssh客户端的编码跟系统编码gbk一致就ok啦~~~

 

修改成功之后,经测试,发现通过部署到Linux环境上后,发送的短信中文显示也不乱码了。至于为何手机接收短信不太支持UTF-8,具体原因没有深究。

 

其实这跟我前段时间做的iReport报表问题差不多,这些问题的出现都是由于windows和linux的一些环境差异造成的。毕竟一般情况下,开发工作是在windows下完成的,然而真正部署上线的是在linux环境中。哭

 

 

 

1
2
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics