我们最近从使用PHP 5.3.4的IIS 7.5迁移到使用PHP 5.5的IIS 8。我们遇到了从MySQL中提取数据的问题。以前的基础设施中没有这个问题。
当从MySQL中提取字符串并显示给客户端时,编码未正确显示。
前:
文本应在旧基础架构上显示为:
“¿QuéplanearonSandra y Carlos en este episodio?
但它显示为:
“¿Quéplanearon Sandra y Carlos en este episodio?”php
我尝试了以下内容:
向客户端添加标头将所有内容解释为UTF-8,无需更改。
标题('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);
答案 0 :(得分:1)
看起来你的数据库是用Latin 1编码而不是UTF8存储的,快速解决方法应该是使用这种语法:
<?php
echo html_entity_decode($row['prompt'],ENT_COMPAT | ENT_HTML401,'ISO-8859-1');
真正的解决方法是修复数据库以UTF8存储数据并使用UTF8中的所有工具链。
自PHP 5.4起,html_entity_decode()将UTF8作为默认编码: http://fr2.php.net/manual/en/migration54.other.php答案 1 :(得分:0)
在php 5.4 ISO-8559-1到UTF-8之后,HTML_entities_decode的默认编码似乎已更改。所以用旧的PHP放入MySQL的内容就像ISO-8859-1一样。以下为我做了诀窍。
html_entity_decode($row['prompt'], ENT_QUOTES, 'ISO-8859-1');