当我从php mysql共享主机移到我自己的VPS时,我发现该代码从mysql数据库输出UTF8中的用户名,输出的是?�??????�
而不是鬼神❗
。我的页面具有utf-8
编码,并且在php.ini中具有default_charset = "UTF-8"
,在php文件中具有header('Content-Type: text/html; charset=utf-8');
,并且在HTML部分中具有<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
。
我的数据库具有排序规则utf8_bin,并且表具有相同的排序规则。在 phpmyadmin 的previos和当前主机上,对于该数据库记录,我看到:鬼神❗
。当我在Notepad ++中创建ANSI文本文件时,将鬼神❗
粘贴到其中并在UTF-8菜单中选择Encoding-> Encode,我看到鬼神❗
,因此我认为它是正确的UTF-8编码字符串。
好,然后我添加了
init_connect='SET collation_connection = utf8_general_bin'
init_connect='SET NAMES utf8'
character-set-server=utf8
collation-server=utf8_general_bin
skip-character-set-client-handshake
到my.cnf,现在我的页面显示鬼神❗
而不是?�??????�
。这与我在两个主机上的 phpmyadmin 中获得的输出相同,所以我采取了正确的方法。仍然以某种方式在我的旧主机上,相同的php脚本在新主机-鬼神❗
上返回名称为鬼神❗
的utf-8网页。看起来该字符串是utf-8编码的两倍:我得到utf-8字符串,将其作为ansi字符串提供给Notepad ++,并将其编码为正确的utf-8字符串。
但是,当我尝试utf8_encode()
时,我得到й¬ÑзÒÑвÑâ
,而utf8_decode()
返回?�???????
。相同的结果返回mb_convert_encoding($name,"UTF-8","ISO-8859-1");
和iconv( "ISO-8859-1","UTF-8", $name);
。
那么我该如何重现Notepad ++的相同转换? 请参阅下面的答案。
答案 0 :(得分:0)
解决方案很简单,但对我来说并不明显,因为我从未在共享主机上看到my.cnf:服务器似乎具有以下设置
init_connect='SET collation_connection = cp1252'
init_connect='SET NAMES cp1252'
character-set-server=cp1252
因此,为了不损害我的新服务器上的其他代码,我必须在每个与utf8字符串一起使用的php脚本之上放置mysql_query("SET NAMES CP1252");
。
这里的窍门是脚本按原样获取(ansi)一个字符串并输出,当警告浏览器该页面采用utf-8编码时,它只是将我的字符串呈现为utf-8。