最近在工作中遇到了飞鹅打印机打印出来中文变成 ‘???’的乱码问题。我们的后端使用的PHP,把拼接好的字符串转换成json格式,然后请求飞鹅云打印机的接口。由于打印排版问题,有的字符串截取开放到第二行显示。结果在测试的时候却发现了打印出来的小票存在乱码问题。排查了一下,代码在字符串在第二十一个字符处截取开,飞鹅打印机默认一个汉字占三个字符,这样截取是不会霸汉字断开的。但字符串中如果加入英文,空格之类的,就可能导致在第二十一个字符处截取时把汉字断开,出现“???”的乱码问题。
我看了下代码发现截取字符串是用的substr() 函数用于从字符串中获取其中的一部分,返回一个字符串。
php中另一个函数 mb_substr可以解决这个问题。
其实substr、mb_substr、mb_strcut这三个函数都用来截取字符串,区别在于:
substr是最简单的截取,无法适应中文,截取中文会产生半个字符的现象,出现乱码;
而mb_substr,mb_strcut是按字符来切分字符串,截取中文不会产生半个字符的现象;
不过要注意的是mb_substr,mb_strcut的使用要开启php.ini里面extension=php_mbstring.dll扩展。