在Debian Linux上发送中文短信的问题解决案例

3160阅读 0评论2014-09-09 yulc
分类:C/C++

记得这个问题是发生在一个警急的项目上,从发现到解决时间在一个小时左右。
以下是事后追补的说明文档,贴在这:
----------------------------------------------------------------------------------------------------------------------

下午接到一项目现场工程师的电话,说有两台Debian的服务器不能发送短信,但另外有一台服务器CentOS5是正常的。
我们发送短信的方案是将短信猫通过串口接入Linux服务器,然后通过PDU协议发送出去。
在排除了短信猫没接好,或者使用的不是中国移动SIM卡这种非技术故障后,我开始翻查实现代码,
看是否代码中会有特殊的环境和类库上的要求(因为CentOS5在现场是正常的)。

考虑到项目紧急,会马上有演示的需求,所以用QQ协作,连上现场工程师的桌面,然后用SSH连至服务器,跟踪日志。
发现程序确实按需进入到了发短信的代码,但却没有正常执行。
于是,用最笨的办法开搞,通过增加打印日志的方式,重新编译程序传过去运行,
发现最后是 mbstowcs() 系统库函数返回失败,这是中文转换的问题。
我发现程序中是强制指定源为GB18030:


点击(此处)折叠或打开

  1. setlocale(LC_CTYPE,"zh_CN.GB18030");



通过命令行设置语言环境,发现报错。过程大致是:
执行:export LANG='zh_CN.GB18030'
然后运行:locale 
如果输出中有类似这样的行,则表示系统不支持GB18030:
locale: Cannot set LC_CTYPE to default locale: No such file or directory


查看了系统中的中文字符库目录/usr/share/i18n/,发现有GB18030的文件:
奇怪了,于是继续度娘。找到了这样的说明:
修改 /etc/locale.gen 
注: 这个文件在我的CentOS上没有发现。


将GB18030的那行取消注释,保存,再执行 locale-gen 命令。
会有这样的输出:

Generating locales (this might take a while)...
  zh_CN.GB18030... done
  en_US.UTF-8... done
Generation complete.

重新启动程序,问题触决了。

上一篇:高清IPCamera中的CCD和CMOS
下一篇:用 ffmpeg + m3u8-segment 将h264的ES流转换成m3u8的过程记录