- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有以下问题:在一个非常简单的 php-mysqli 查询上:
if ( $result = $mysqli->query( $sqlquery ) )
{
$res = $result->fetch_all();
$result->close();
}
尽管数据库、表和列在 utf8_general_ci
排序规则中,但我得到的字符串被错误地编码为西方编码字符串。 php 脚本本身是 utf-8 编码的,脚本的无 mysql 部分得到正确的编码。所以说 echo "ő"
工作得很好,但是上一个示例中的 echo $res[0]
在文件时输出 EF BF BD
字符以正确的 UTF-8 编码查看。如果我手动将浏览器的编码切换为西方编码,则 mysqli 来源的字符串会得到很好的解码,除了被替换为“?”的非西方字符。
更奇怪的是,在我的开发环境中没有发生这种情况,而在我的网络服务器上却发生了。开发环境是 LAMP 堆栈(统一服务器),而网络服务器使用 nginx。
在这种情况下,我使用 phpMyAdmin 在数据库中输入了数据,在 phpmyadmin 中它显示完美。 phpMyAdmin 的排序规则也是 utf-8。我相信问题一定出在附近,与在同一网络服务器上一样,对于我通过 php(使用 POST)输入数据的其他站点,同样的问题不会发生。在这种情况下,数据在输入和查看时都是正确可见的(我的意思是在 php 生成的网页中),但特殊字符在 phpMyAdmin 中不正确。
你能帮我从哪里开始调试吗?它是否连接到 php 或 mysql 或 nginx 或 phpMyAdmin?
最佳答案
使用mysqli_set_charset
连接后立即将客户端编码更改为 UTF-8:
$mysqli->set_charset("utf8");
客户端编码是 MySql 期望您输入的内容(例如,当您将用户提供的文本插入搜索查询时)以及它为您提供的结果(因此它必须与您的输出编码匹配以便 echo
以正确显示内容)。
您需要让它与网页的编码相匹配,以解决上述两种情况和 PHP 源文件的编码(以便正确解释查询的硬编码部分) .
更新:如何将使用 latin-1 插入的数据转换为 utf-8
关于已经使用错误的连接编码插入的数据,有一个方便的解决方案来解决这个问题。对于包含此类数据的每一列,您需要执行以下操作:
ALTER TABLE table_name MODIFY column_name existing_column_type CHARACTER SET latin1;
ALTER TABLE table_name MODIFY column_name BLOB;
ALTER TABLE table_name MODIFY column_name existing_column_type CHARACTER SET utf8;
每次都应将占位符 table_name
、column_name
和 existing_column_type
替换为数据库中的正确值。
这是做什么的
BLOB
)。此时该列将包含原始字节,它们是正确的 utf8 字符串。警告:如果相关列仅包含错误插入的数据,您只能使用这种不分青红皂白的方法。任何已正确插入的数据都将在第一次出现任何非 ASCII 字符时被截断!
因此,最好在 PHP 端修复生效之前立即执行此操作。
关于php - MySQL 在 UTF-8 PHP 文件中输出西方编码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12737875/
当从输入文件读取数据时,我注意到 StreamReader 没有读取 ¥ 符号。 Mozilla Firefox 显示输入文件类型为 Western (ISO-8859-1)。 在尝试了编码参数之后,
我是一名优秀的程序员,十分优秀!