我从Utf-8 mysql表中获得了Ansi字符串而不是Utf-8

时间:2018-10-22 15:54:40

标签: php mysql utf-8 character-encoding

当我从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 ++的相同转换? 请参阅下面的答案。

1 个答案:

答案 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。