本帖最后由 二头Neo_Wu 于 2014-11-6 16:42 编辑
开启了微信注册功能,然后发现有用户的用户名为空出现。
经过核实是因为,微信的名字是允许使用表情符号的,而在UTF-8的解码中,许多表情符号是无法正常解析的。
导致在username传入后,系统判断其有长度,但在数据库存储过程中,无法存入,导致为空。
服务号是有权获取用户nickname的,所以wechat插件里是直接使用nickname作为初始账号,而在快速注册的过程中,也只是简单检查并截取到15位(UTF-8,等效5个中文字)
建议在初始化defaultusername的时候就进行特殊字符过滤。我使用的是网上人家写好的方法,追加在wechat.lib.class.php的最后
- /** 過濾字符串,保留UTF8字母數字中文及部份符號
- * @param String $ostr
- * @return String
- * @author 傲雪星枫 http://blog.csdn.net/fdipzone/article/details/14047191
- */
- function filter_utf8_char($ostr){
- preg_match_all('/[\x{FF00}-\x{FFEF}|\x{0000}-\x{00ff}|\x{4e00}-\x{9fff}]+/u', $ostr, $matches);
- $str = join('', $matches[0]);
- if($str==''){ //含有特殊字符需要逐個處理
- $returnstr = '';
- $i = 0;
- $str_length = strlen($ostr);
- while ($i<=$str_length){
- $temp_str = substr($ostr, $i, 1);
- $ascnum = Ord($temp_str);
- if ($ascnum>=224){
- $returnstr = $returnstr.substr($ostr, $i, 3);
- $i = $i + 3;
- }elseif ($ascnum>=192){
- $returnstr = $returnstr.substr($ostr, $i, 2);
- $i = $i + 2;
- }elseif ($ascnum>=65 && $ascnum<=90){
- $returnstr = $returnstr.substr($ostr, $i, 1);
- $i = $i + 1;
- }elseif ($ascnum>=128 && $ascnum<=191){ // 特殊字符
- $i = $i + 1;
- }else{
- $returnstr = $returnstr.substr($ostr, $i, 1);
- $i = $i + 1;
- }
- }
- $str = $returnstr;
- preg_match_all('/[\x{FF00}-\x{FFEF}|\x{0000}-\x{00ff}|\x{4e00}-\x{9fff}]+/u', $str, $matches);
- $str = join('', $matches[0]);
- }
- return $str;
- }
复制代码 同时wechat.lib.class.php增加语句$str = filter_utf8_char($str) ? filter_utf8_char($str) : $str; // 过滤无法识别字符
- class WeChatEmoji {
- public static function clear($str) {
- $config = self::getList();
- $str = filter_utf8_char($str) ? filter_utf8_char($str) : $str; // 过滤无法识别字符
- $str = str_replace($config, '', $str);
- return diconv($str, 'UTF-8', CHARSET);
- }
复制代码 因为几乎所有会出现特殊字符的,都使用的WeChatEmoji::clear函数,这样改比较暴力,可以从表面处理下。
希望官方能有更完善的解决方案。
|