问题
一直在用的Limesurvey系统运行稳定,近日有同事发现一个问题:将limesurvey搜集到的问卷结果反馈导出为SPSS格式时,中文出现乱码。

分析解决
处理导出SPSS语法文件的链接是admin.php?action=exportspss&sid={问卷id}&subaction=dlstructure,查看admin/admin.php源码,找到exprortspss对应的export_data_spss.php,然后查看export_data_spss.php源码,dlstructure对应的函数在最后面,定位到乱码位置(乱码在Variable Properties),主要是这个函数出了问题:addslashes(strip_tags_full(mb_substr($field[‘VariableLabel’],0,$length_varlabel))),检查了数据库编码、mb的配置,都没问题,因为是中文于是就试了网上提供的一些mb_substr中文乱码的解决方案,声明编码为GB2312格式,还是乱码;想到数据都是utf-8的,为什么硬要声明成gb2312呢,将上述代码改成addslashes(strip_tags_full(mb_substr($field[‘VariableLabel’],0,$length_varlabel,‘utf-8’))),问题解决。

原因
用函数mb_detect_encoding检测$field[‘VariableLabel’]元素的编码类型,前几个变量,比如手机号、email等是ASCII编码,之后的中文是UTF-8编码,不手动声明的话mb_substr对字符串默认编码判断不准导致中文乱码?