discuz后台搜索用户导出比实际少的问题解决方案

2019-06-02 1254 0条评论

问题现象:

     后台用户管理搜索用户然后导出,导出的用户数比实际的少

问题分析:

     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    


     打开: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;

}


提示: 使用mb_convert_encoding 函数需要开启mbstring模块


文章版权及转载声明

本文作者:符文浩 网址:http://blog.fuwenhao.com/post/205.html 发布于 2019-06-02
文章转载或复制请以超链接形式并注明出处。

发表评论

快捷回复:

评论列表 (暂无评论,1254人围观)参与讨论

还没有评论,来说两句吧...

取消
微信二维码
微信二维码
支付宝二维码