我做了一个php个人网站,在本地浏览的时候一点问题都没有,上传到一个国外的服务器后发现有乱码问题,请高手帮我看看怎么回事。数据库及php文件本身都采用UTF-8编码,输出的网页也用meta和header()函数都指定UTF-8编码了。然后把信息从数据库读出来,用smarty放到网页里,一部分是直接赋给网页,还有一部分比如该页面的所有留言是赋给了一个JavaScript数组变量,就是赋给数组变量的这部分的中文全部变成了乱码,英文没问题。当然smarty再给JavaScript数组变量赋值之前我先将php的数组变量进行了JSON转换,我不清楚是不是这一步出的问题,相关代码如下:/**这是JSON类*/
class Json{
    public static function encode($str){
        $code = json_encode($str);
        return preg_replace("#\\\u([0-9a-f]+)#ie", "iconv('UCS-2', 'UTF-8', pack('H4', '\\1'))", $code);
    }
    public static function decode($str){
        return json_decode($str);
    }
}//输出页面时
$smarty->assign('message' , Json::encode($message_array));            //替换模板变量//js脚本
var comts=[##$message##]   //这里我用[## ##]作为smarty变量标识
请高手给我解答一下吧!万分感谢!

解决方案 »

  1.   

    $str = mb_convert_encoding( '$str', 'UTF-8' );强制传化成 成utf-8 编码
      

  2.   

    可能是mysql数据库编码问题。
      

  3.   

    return preg_replace("#\\\u([0-9a-f]+)#ie", "iconv('UCS-2', 'UTF-8', pack('H4', '\\1'))", $code); 
    问题出现在这
    你从数据库里取出的数据是否为 ucs-2
      

  4.   


    嗯,问题确实出现在这里,我在程序里直接用json_encode代替Json::encode方法就没问题了,谢谢。不过我也试着把Json::encode里的iconv('UCS-2', 'UTF-8', pack('H4', '\\1'))
    改成iconv('UTF-8', 'UTF-8', pack('H4', '\\1')),似乎还是没用还有一点就是我本地的各种设置和服务器上是一样的,为什么原先在本地都没问题而在服务器上有问题呢,
    如果是iconv('UCS-2', 'UTF-8', pack('H4', '\\1'))这句的问题的话那本地的也该出现乱码才对啊?
      

  5.   

    本地 的 apache  和 mysql 等的默认编码都可能是 utf-8 ,但服务器上一不一定了特别是用 js 处理的中文,要保持  js 的源码 也是 utf-8
      

  6.   

    我确实是从源头就控制了的,所有文件编码以及数据库编码都是UTF-8的,这段JS脚本是写在HTML页面里的,所以肯定也是UTF-8编码,而且国外的服务器上的MYSQL我查了编码也是UTF-8的,字符集上的设置和我本地是一样的。除非是它的服务器的默认编码不是UTF-8的,但是国外的服务器而且还是付费的一般字符集也应该是UTF-8的吧。所以,这个问题最终还是没有搞清楚……