Discuz!官方免费开源建站系统

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索

wechat插件注册问题

[复制链接]
二头Neo_Wu 发表于 2014-11-6 16:41:05 | 显示全部楼层 |阅读模式
本帖最后由 二头Neo_Wu 于 2014-11-6 16:42 编辑

开启了微信注册功能,然后发现有用户的用户名为空出现。

经过核实是因为,微信的名字是允许使用表情符号的,而在UTF-8的解码中,许多表情符号是无法正常解析的。

导致在username传入后,系统判断其有长度,但在数据库存储过程中,无法存入,导致为空。

服务号是有权获取用户nickname的,所以wechat插件里是直接使用nickname作为初始账号,而在快速注册的过程中,也只是简单检查并截取到15位(UTF-8,等效5个中文字)

建议在初始化defaultusername的时候就进行特殊字符过滤。我使用的是网上人家写好的方法,追加在wechat.lib.class.php的最后
  1. /** 過濾字符串,保留UTF8字母數字中文及部份符號
  2. *   @param  String  $ostr
  3. *   @return String
  4. *   @author 傲雪星枫 http://blog.csdn.net/fdipzone/article/details/14047191
  5. */
  6. function filter_utf8_char($ostr){
  7.     preg_match_all('/[\x{FF00}-\x{FFEF}|\x{0000}-\x{00ff}|\x{4e00}-\x{9fff}]+/u', $ostr, $matches);
  8.     $str = join('', $matches[0]);
  9.     if($str==''){   //含有特殊字符需要逐個處理
  10.         $returnstr = '';
  11.         $i = 0;
  12.         $str_length = strlen($ostr);
  13.         while ($i<=$str_length){
  14.             $temp_str = substr($ostr, $i, 1);
  15.             $ascnum = Ord($temp_str);
  16.             if ($ascnum>=224){
  17.                 $returnstr = $returnstr.substr($ostr, $i, 3);
  18.                 $i = $i + 3;
  19.             }elseif ($ascnum>=192){
  20.                 $returnstr = $returnstr.substr($ostr, $i, 2);
  21.                 $i = $i + 2;
  22.             }elseif ($ascnum>=65 && $ascnum<=90){
  23.                 $returnstr = $returnstr.substr($ostr, $i, 1);
  24.                 $i = $i + 1;
  25.             }elseif ($ascnum>=128 && $ascnum<=191){ // 特殊字符
  26.                 $i = $i + 1;
  27.             }else{
  28.                 $returnstr = $returnstr.substr($ostr, $i, 1);
  29.                 $i = $i + 1;
  30.             }
  31.         }
  32.         $str = $returnstr;
  33.         preg_match_all('/[\x{FF00}-\x{FFEF}|\x{0000}-\x{00ff}|\x{4e00}-\x{9fff}]+/u', $str, $matches);
  34.         $str = join('', $matches[0]);
  35.     }
  36.     return $str;
  37. }
复制代码
同时wechat.lib.class.php增加语句$str = filter_utf8_char($str) ? filter_utf8_char($str) : $str; // 过滤无法识别字符
  1. class WeChatEmoji {

  2.         public static function clear($str) {
  3.                 $config = self::getList();
  4.                 $str = filter_utf8_char($str) ? filter_utf8_char($str) : $str; // 过滤无法识别字符
  5.                 $str = str_replace($config, '', $str);
  6.                 return diconv($str, 'UTF-8', CHARSET);
  7.         }
复制代码
因为几乎所有会出现特殊字符的,都使用的WeChatEmoji::clear函数,这样改比较暴力,可以从表面处理下。

希望官方能有更完善的解决方案。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|Discuz! 官方站 ( 皖ICP备16010102号 )star

GMT+8, 2025-7-10 07:20 , Processed in 0.146510 second(s), 18 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表