之前在弄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);
}
- 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);
- }
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);
- $uname = iconv( "GBK", "UTF-8",$uname);
$uname = iconv( "GBK", "UTF-8",$uname);
看完了?留个评分呗?
[0人评了分,平均: 0/5]