Linux(CentOS/CTyunOS)缺少GBK、GB2312中文字符集
在CTyunOS上部署新项目,运行到正则匹配的地方报错
terminate called after throwing an instance of 'boost::wrapexcept<boost::xpressive::regex_error>' what(): invalid named back-reference
#正则表达式没有正确被加载,导致进行正则匹配时正则表达式的格式错误
排查发现并不是程序从配置文件中读取数据时发生错误,而是在程序内部调用mbstowcs()函数时,由于缺失字符集发生错误
mbstowcs()
C 标准库(
<cstdlib>
或<stdlib.h>
)的一部分。具体来说,它用于将多字节字符串(通常是 UTF-8 编码)转换为宽字符字符串(wchar_t
类型)
程序中是要将 "abcd\123\234\345\456" 这种从配置文件中读取到的包含中文字符的GBK编码的多字节字符串转化成宽字符字符串(其中每两个\为一个中文字符),但是由于系统没有GBK字符集,导致 setlocale(LC_ALL, "GBK") 设置字符集失败,程序也无法识别这种带 '\' 的GBK多字节字符串。这就造成 mbstowcs() 遇到 '\' 时出错,但是这个错误又不会有中断和告警,只是单纯的遇到 '\' 直接停止,不会继续转化后面的所有字符,也就是说我们最终获取到的字符串只有 "abcd"。这页是正则匹配时报错的原因:正则表达式有很严谨的括号规则, mbstowcs() 中断会造成前后括号不匹配,无法分析正则表达式。
解决办法:安装指定字符集
1、使用 locale -a 查看当前系统已有字符集,里面肯定没有你想要的字符集
2、查看 /usr/share/locale 目录下有没有你想要的字符集,存在的字符集代表该系统支持此字符集,这里是zh_CN.GBK
3、查看 /usr/share/i18n/locales/ 目录下是否有 zh_CN(定义 zh_CN 语言的配置文件)
以及/usr/share/i18n/charmaps/ 目录下是否有 GBK.gz(定义 GBK 字符集的映射文件)
如果以上文件均存在,代表系统已经安装了此字符集
如果不存在,则yum install glibc-common、glibc-locale-source、glibc-langpack-zh
安装后再次检查可以发现上述两项均已存在
4、sudo localedef -i zh_CN -f GBK zh_CN.GBK 生成字符集配置
5、再次locale -a 可以看到已经成功添加 zh_CN.GBK 字符集
6、再次运行程序,可以看到 mbstowcs() 函数已经能正常将多字节GBK字符串转化成boost库所需的宽字符字符串,正则匹配能够正常进行