0

我试图从 db 获取一些数据,但输出不是我所期望的。
在数据库上做我自己的查询,我得到这个输出:string 'C�te d�Ivoire' (length=13)

从 phpmyadmin 查询数据库我得到正常输出:科特迪瓦

php.ini 默认字符集、mysql db 默认字符集、<meta>字符集都设置为 utf-8 。

我无法确定在哪里进行编码,因为我得到具有相同配置的不同输出。

PS:使用mysqli驱动。

4

2 回答 2

3

在给您错误结果的同一页面中,请先尝试运行此指令

print base64_encode("Côte");

正确答案是Q8O0dGU...。如果您得到其他内容,例如Q/R0ZQo...,这意味着您的脚本正在使用另一个字符集(此处为 Latin-1)而不是 UTF-8。仍然有可能MySQL 和浏览也在耍花招,但上面的行确保PHP 和/或您的编辑器在欺骗您。

接下来,Côte从数据库中提取并输出其base64_encode. 如果您看到Q8O0...,那么 MySQL 和 PHP 之间的连接是安全的 UTF8。如果没有,那么可能需要其他任何东西,您需要更改 MySQL 字符集(SET NAMES utf8和/或ALTER表和数据库排序规则)。

如果 PHP 是 UTF8,而 MySQL 是 UTF8,你仍然看到无效字符,那么它是 PHP 和浏览器之间的东西。验证内容类型标头是否正确发送;如果没有,请尝试将其作为脚本中的第一件事发送:

Header('Content-Type: text/html; charset=UTF8');

例如在 Apache 配置中你应该有

AddDefaultCharset utf-8

还要确认您的浏览器未设置为同时覆盖服务器字符集和自动检测。

注意:根据经验,如果您得到一个带有问号而不是 UTF8 国际字符的菱形,这意味着 UTF8 阅读器收到了无效的 UTF8 代码点。换句话说,显示菱形的实体(您的浏览器)期待 UTF8,但正在接收其他内容,例如 Latin1 aka ISO-8859-15。

另一种难以跟踪的获取该错误的方法是,如果输出以某种方式包含字节顺序标记 (BOM)。如果您创建一个文件,例如

###<?php
    Header("Content-Type: text/html; charset=UTF8");
?>
<html>
     <head>
         <meta http-equiv="content-type" content="text/html; charset=UTF8" />
     </head>
     <body>
         Hellò, world!
     </body>
</html>

其中### 是(在大多数编辑器中不可见)UTF8 BOM。要删除它,如果编辑器允许,您需要将文件另存为“无 BOM”,或者使用其他编辑器。

于 2012-10-09T21:23:33.027 回答
0

如果您使用命令行工具 mysql 进行“自己的查询”,您也必须设置 option --default-character-set=utf8。否则,请告诉我们您如何进行自己的查询。

于 2012-10-09T21:19:48.090 回答