之前在弄ecshop的时候,发现UC通讯成功但是无法登陆,找了半天原因是中文的用户无法登陆,而英文的可以。网上没有解决方案,这里自己研究了下,提供给大家。
首先问题出在了编码上,我的discuz是GBK自然UC_Server也是GBK,而ecshop是UTF8,这导致双方通讯的中文会变成乱码,解决方法是,将所有UTF-8的提交的传输,都强制改成GBK。
修改文件为:uc_client下的client.php
- 找到uc_api_post,替换成:
function uc_api_post($module, $action, $arg = array()) { $s = $sep = ''; foreach ($arg as $k => $v) { // 强制转换编码方式为GBK,以兼容通行证 $k = iconv("UTF-8", "GBK", $k); $k = urlencode($k); if (is_array($v)) { $s2 = $sep2 = ''; foreach ($v as $k2 => $v2) { // 强制转换编码方式为GBK,以兼容通行证 $k2 = iconv("UTF-8", "GBK", $k2); $k2 = urlencode($k2); // 强制转换编码方式为GBK,以兼容通行证 $tmp = iconv("UTF-8", "GBK", uc_stripslashes($v2)); $s2 .= "$sep2{$k}[$k2]=" . urlencode($tmp); $sep2 = '&'; } $s .= $sep . $s2; } else { // 强制转换编码方式为GBK,以兼容通行证 $v = iconv("UTF-8", "GBK", uc_stripslashes($v)); $s .= "$sep$k=" . urlencode($v); } $sep = '&'; } $postdata = uc_api_requestdata($module, $action, $s); $result = uc_fopen2(UC_API . '/index.php', 500000, $postdata, '', true, UC_IP, 20); // 强制转换编码方式为utf-8,以兼容现有网站 return iconv("GBK", "UTF-8", $result); }
- 搜索所有username的function,在第一行增加$username = iconv( “UTF-8”, “GBK”,$username);需要注意的是,有个地方有oldname和newname,只是给修改用户名用的,我把这个程序阉割了,所以没改,有需求的记得改下
*****************************11.30.2016更新*************************
经过以上修改,依旧存在一个问题,在同步登陆,或者使用中文在UTF-8登陆的时候,用户名会显示为空,
问题出在了,当uc返回用户名的时候,是GBK,需要将其转化为UTF-8才能存入数据库,修改方法如下:
- /includes/modules/integrates/ucenter.php
- 找到function login($username, $password, $remember = NULL)
- 在$uname = addslashes($uname); 下面增加
$uname = iconv( "GBK", "UTF-8",$uname);