【发布时间】:2013-09-04 15:26:56
【问题描述】:
我们最近从带有 PHP 5.3.4 的 IIS 7.5 迁移到带有 PHP 5.5 的 IIS 8。我们在从 MySQL 中提取数据时遇到问题。以前的基础架构不存在此问题。
当从 MySQL 中提取字符串并显示给客户端时,编码显示不正确。
例如:
文本应该在旧的基础设施上显示:
"¿Qué planearon Sandra y Carlos en este episodio?
但它显示为:
"¿Quéplanaron Sandra y Carlos en este episodio?"php
我尝试了以下方法:
-
向客户端添加标头将全部解释为 UTF-8,没有变化。
header('content-type: text/html; charset=utf-8');
-
回显下面的编码字符:(它们向客户端正确显示为:ä ö ü ß €。)
"\xc3\xa4"."\xc3\xb6"."\xc3\xbc"."\xc3\x9f"."\xe2\x82\xac";
为 UTF-8 的 html_entity_decode 添加编码选项。没有变化。
有什么想法吗?代码打击。
<?php
ini_set('display_errors',1);
error_reporting(E_ALL);
// CONNECT TO THE DATABASE
$DB_NAME = 'removed';
$DB_HOST = 'removed';
$DB_USER = 'removed';
$DB_PASS = 'removed';
$mysqli = new mysqli($DB_HOST, $DB_USER, $DB_PASS, $DB_NAME);
if (mysqli_connect_errno()) {
printf("Connect failed: %s\n", mysqli_connect_error());
exit();
}
// A QUICK QUERY ON A FAKE USER TABLE
$query = "SELECT * FROM `tablename` WHERE `item`='1234'";
$result = $mysqli->query($query) or die($mysqli->error.__LINE__);
// GOING THROUGH THE DATA
if($result->num_rows > 0) {
while($row = $result->fetch_assoc()) {
echo html_entity_decode($row['prompt']);
}
}
else {
echo 'NO RESULTS';
}
// CLOSE CONNECTION
mysqli_close($mysqli);
【问题讨论】:
-
您似乎遇到了字节顺序标记 (BOM) 问题。 More on this here。您的文件可能设置为“没有”BOM,并且需要保存为带有 BOM 的 UTF-8,您可以使用 Notepad++
-
您的整个渲染链必须使用相同的字符集,或者至少与适当的翻译逻辑链接。如果您的 database-php 链接设置为其他内容,则告诉浏览器使用 utf-8 是没有意义的。
-
我尝试使用编码为 UTF-8 的 NP++ 以及没有 BOM 的 UTF-7 进行保存。具有相同的行为。我发现一件有趣的事情是我可以用 iconv("UTF-8", "ISO-8859-1", $text), PHP_EOL; 解码一个静态字符串。但是,当该字符串由 mysqli 设置时,即使我回显每个设置的变量(静态或来自 mysql,它们看起来是相同的),它也无法转换。