utf8 字符在转换为 mysqli_query() 后错误地显示为问号
utf8 characters wrongly displayed as question marks after conversion to mysqli_query()
我的数据库是 latin1_swedish_ci,但所有包含外来字符(德语、土耳其语...)的表都是 utf8_general_ci。
升级到php5.6之前,我用的是
mysql_query("SET CHARACTER SET utf8;");
mysql_query("SET NAMES utf8");
在 mysql_query()
之前,所有内容都正确显示在我的页面中(<meta http-equiv="content-type" content="text/html;charset=UTF-8" />
在页眉中)。
在php 5.6下所有mysql_query(...)
转为mysqli_query(id,...)
和运行后,所有的外文现在都乱码了?和...切换回 php 5.4 没有帮助。 phpMyAdmin 正确显示 mysql 数据库(未更改)。
我四处寻找解决方案,但没有任何效果...我是不是遗漏了什么?
我的代码需要更改什么才能正常工作?
这些乱码是浏览器或其他用户可见的软件包将 utf-8 字符渲染为 ASCII 或 Latin-1 的结果。
编辑 在 Chrome 浏览器中,您可以查看浏览器呈现页面时使用的编码。单击右上角的 chrome 菜单(三个小水平线)。单击更多工具> 单击编码> 然后您将看到字符集的选择。尝试选择不同的。
尝试将此行放入您的 HTML 文档的 <HEAD>
部分。
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
这可能会强制浏览器使用正确的字符集。
编辑结束
切换到 mysqli 后,您是否在打开 mysql 会话时保留了 SET CHARACTER SET
和 SET NAMES
查询?如果没有,请将它们放回去,看看是否有帮助。
可能您的数据库工作正常,但 php 告诉浏览器您使用的是 Latin-1。事实上,这很可能是因为 phpmyadmin 工作正常。
尝试执行此处建议的操作:Setting PHP default encoding to utf-8?
字符集和排序规则存在很多概念上的混淆。当你说
My database is latin1_swedish_ci
你的意思是新定义的 table 的默认字符集是 latin1
并且默认排序规则是不区分大小写的瑞典语。这些只是默认值。对数据存储重要的是用于每一列的字符集。你说那是utf8
。排序规则 (utf8_general_ci
) 仅对搜索和匹配有效。
再三搜索后...
MAMP MySQL not recognizing my.cnf values in OSX
Does MySQL included with MAMP not include a config file?
http://www.toptal.com/php/a-utf-8-primer-for-php-and-mysql
这是解决方案。
在我的 php 脚本中,我必须在连接到数据库后添加一个字符集查询。
$con=mysqli_connect($host",$user,$password,$db);
mysqli_set_charset($con,"utf8");
我以前在 mysql_query() 中使用的 php 5.4 之前的字符集和名称已经不够用了。
mysqli_query($con,"SET CHARACTER SET utf8;");
mysqli_query($con,"SET NAMES utf8");
在我的本地服务器上,我还必须在添加包含以下行的 my.cnf 文件后重新编译 mysql:
[client]
default-character-set=utf8
[mysql]
default-character-set=utf8
[mysqld]
default-storage-engine = InnoDB
character-set-client-handshake
collation-server=utf8_general_ci
character-set-server=utf8
[mysqld_safe]
default-character-set=utf8
我还必须通过编辑 MAMP/Library/share/charsets/index.xml 并添加以下行来将 utf8 字符集添加到 MAMP 中:
<charset name="utf8">
<family>Unicode</family>
<description>UTF8 Unicode</description>
<alias>utf8</alias>
<collation name="utf8_general_ci" id="33">
<flag>primary</flag>
<flag>compiled</flag>
</collation>
<collation name="utf8_bin" id="83">
<flag>binary</flag>
<flag>compiled</flag>
</collation>
</charset>
在我的网络服务器上,上述 2 个步骤不是必需的。
我遇到了同样的问题。
不确定这是否有帮助,但作为菜鸟,我无法理解或实施此问题答案的复杂性。
首先,我将此添加到我的 html 页面:
<meta charset="utf-8"/>.
然后,我进入 PHPMyAdmin,单击我在浏览器中看到菱形圆圈问号的列,然后在数据库级别将编码重置为 UTF-8。
希望对您有所帮助。当然对我来说很容易。
我的数据库是 latin1_swedish_ci,但所有包含外来字符(德语、土耳其语...)的表都是 utf8_general_ci。
升级到php5.6之前,我用的是
mysql_query("SET CHARACTER SET utf8;");
mysql_query("SET NAMES utf8");
在 mysql_query()
之前,所有内容都正确显示在我的页面中(<meta http-equiv="content-type" content="text/html;charset=UTF-8" />
在页眉中)。
在php 5.6下所有mysql_query(...)
转为mysqli_query(id,...)
和运行后,所有的外文现在都乱码了?和...切换回 php 5.4 没有帮助。 phpMyAdmin 正确显示 mysql 数据库(未更改)。
我四处寻找解决方案,但没有任何效果...我是不是遗漏了什么?
我的代码需要更改什么才能正常工作?
这些乱码是浏览器或其他用户可见的软件包将 utf-8 字符渲染为 ASCII 或 Latin-1 的结果。
编辑 在 Chrome 浏览器中,您可以查看浏览器呈现页面时使用的编码。单击右上角的 chrome 菜单(三个小水平线)。单击更多工具> 单击编码> 然后您将看到字符集的选择。尝试选择不同的。
尝试将此行放入您的 HTML 文档的 <HEAD>
部分。
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
这可能会强制浏览器使用正确的字符集。
编辑结束
切换到 mysqli 后,您是否在打开 mysql 会话时保留了 SET CHARACTER SET
和 SET NAMES
查询?如果没有,请将它们放回去,看看是否有帮助。
可能您的数据库工作正常,但 php 告诉浏览器您使用的是 Latin-1。事实上,这很可能是因为 phpmyadmin 工作正常。
尝试执行此处建议的操作:Setting PHP default encoding to utf-8?
字符集和排序规则存在很多概念上的混淆。当你说
My database is latin1_swedish_ci
你的意思是新定义的 table 的默认字符集是 latin1
并且默认排序规则是不区分大小写的瑞典语。这些只是默认值。对数据存储重要的是用于每一列的字符集。你说那是utf8
。排序规则 (utf8_general_ci
) 仅对搜索和匹配有效。
再三搜索后...
MAMP MySQL not recognizing my.cnf values in OSX
Does MySQL included with MAMP not include a config file?
http://www.toptal.com/php/a-utf-8-primer-for-php-and-mysql
这是解决方案。
在我的 php 脚本中,我必须在连接到数据库后添加一个字符集查询。
$con=mysqli_connect($host",$user,$password,$db);
mysqli_set_charset($con,"utf8");
我以前在 mysql_query() 中使用的 php 5.4 之前的字符集和名称已经不够用了。
mysqli_query($con,"SET CHARACTER SET utf8;");
mysqli_query($con,"SET NAMES utf8");
在我的本地服务器上,我还必须在添加包含以下行的 my.cnf 文件后重新编译 mysql:
[client]
default-character-set=utf8
[mysql]
default-character-set=utf8
[mysqld]
default-storage-engine = InnoDB
character-set-client-handshake
collation-server=utf8_general_ci
character-set-server=utf8
[mysqld_safe]
default-character-set=utf8
我还必须通过编辑 MAMP/Library/share/charsets/index.xml 并添加以下行来将 utf8 字符集添加到 MAMP 中:
<charset name="utf8">
<family>Unicode</family>
<description>UTF8 Unicode</description>
<alias>utf8</alias>
<collation name="utf8_general_ci" id="33">
<flag>primary</flag>
<flag>compiled</flag>
</collation>
<collation name="utf8_bin" id="83">
<flag>binary</flag>
<flag>compiled</flag>
</collation>
</charset>
在我的网络服务器上,上述 2 个步骤不是必需的。
我遇到了同样的问题。 不确定这是否有帮助,但作为菜鸟,我无法理解或实施此问题答案的复杂性。
首先,我将此添加到我的 html 页面:
<meta charset="utf-8"/>.
然后,我进入 PHPMyAdmin,单击我在浏览器中看到菱形圆圈问号的列,然后在数据库级别将编码重置为 UTF-8。
希望对您有所帮助。当然对我来说很容易。