这个问题在这里已经有答案了:
utf-8全程(16个答案)
两年前关门了。
当我从php-mysql共享主机转移到我自己的vps时,我发现从mysql数据库输出utf8用户名的代码 ?�??????�
而不是 鬼神❗
. 我的页面有 utf-8
编码,我有 default_charset = "UTF-8"
在php.ini中,以及 header('Content-Type: text/html; charset=utf-8');
在我的php文件中,以及 <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
它的html部分。
我的数据库具有排序规则utf8\u 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的web页面 鬼神❗
在新主机上- 鬼神❗
. 它看起来像是两个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条答案
按热度按时间yi0zb3m41#
解决方案很简单,但对我来说并不明显,因为我从未在共享主机上看到my.cnf:似乎该服务器有如下设置
所以为了不损害我的新服务器上的其他代码,我必须
mysql_query("SET NAMES CP1252");
在每个使用utf8字符串的php脚本之上。这里的技巧是脚本按原样获取一个字符串(ansi)并输出它,当浏览器被警告页面使用utf-8编码时,它只将我的字符串呈现为utf-8。