大师兄 发表于 2017-12-16 13:55:49

dz后台用户管理搜索用户然后导出,导出的用户数比实际的少解决方法

最近有一些站长朋友遇到通过后台用户管理搜索用户后导出,发现导出的用户数比实际的少的问题,下面一起分析下问题,然后找下解决方法。

问题分析:

discuz! 函数中的使用的是diconv函数进行的转换,通过调试发现转换为GBK编码的时候使用iconv函数进行转换时,字符被截取了。但是 $out = iconv($in_charset, $out_charset.'//IGNORE', $str);是带有 ‘//IGNORE ’代表遇到转换不了的字符忽略,然而还是被截取了。最后查资料发现是iconv的bug,将iconv从‘glibc’ 更改为‘libiconv ’ (重新编译iconv模块)或者,使用mb_convert_encoding来进行转换即可解决。

解决方法:

1、 Linux环境重新编译iconv, 从‘glibc’ 更改为‘libiconv ’ (具体编译请到网上搜索相关资料)

2、使用mb_convert_encoding代替 iconv(提示: 使用mb_convert_encoding 函数需要开启mbstring模块)

打开:source/function/function_core.php
function diconv($str, $in_charset, $out_charset = CHARSET, $ForceTable = FALSE) {
      global $_G;

      $in_charset = strtoupper($in_charset);
      $out_charset = strtoupper($out_charset);

      if(empty($str) || $in_charset == $out_charset) {
                return $str;
      }

      $out = '';

      if(!$ForceTable) {
                if(function_exists('iconv')) {
                        $out = iconv($in_charset, $out_charset.'//IGNORE', $str);
                } elseif(function_exists('mb_convert_encoding')) {
                        $out = mb_convert_encoding($str, $out_charset, $in_charset);
                }
      }

      if($out == '') {
                $chinese = new Chinese($in_charset, $out_charset, true);
                $out = $chinese->Convert($str);
      }

      return $out;
}更改为:
function diconv($str, $in_charset, $out_charset = CHARSET, $ForceTable = FALSE) {
      global $_G;

      $in_charset = strtoupper($in_charset);
      $out_charset = strtoupper($out_charset);

      if(empty($str) || $in_charset == $out_charset) {
                return $str;
      }

      $out = '';

      if(!$ForceTable) {
                if(function_exists('mb_convert_encoding')) {
                        $out = mb_convert_encoding($str, $out_charset, $in_charset);
                }elseif(function_exists('iconv')) {
                        $out = iconv($in_charset, $out_charset.'//IGNORE', $str);
                }
      }

      if($out == '') {
                $chinese = new Chinese($in_charset, $out_charset, true);
                $out = $chinese->Convert($str);
      }

      return $out;
}上传覆盖,更新缓存即可解决。

但这个方法依然存在一定的不足,欢迎其他开发者提供更完美的解决方法。
页: [1]
查看完整版本: dz后台用户管理搜索用户然后导出,导出的用户数比实际的少解决方法