- UID
- 680981
- 积分
- 0
- 金币
- 8
- 精华
- 0
- 威望
- 0
- 贡献
- 0
- 阅读权限
- 220
- 注册时间
- 2011-1-9
- 最后登录
- 2026-5-3
- 在线时间
- 0 小时
热心网友
- 金币
- 8
- 阅读权限
- 220
- 精华
- 0
- 威望
- 0
- 贡献
- 0
- 在线时间
- 0 小时
- 注册时间
- 2011-1-9
|
问题现象: 后台用户管理搜索用户然后导出,导出的用户数比实际的少 问题分析: 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模块
iconv, 转换, 函数, 使用, 问题 |
|