【问题标题】:PHP 5.5 with html_entity_decode and IIS8带有 html_entity_decode 和 IIS8 的 PHP 5.5
【发布时间】: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

我尝试了以下方法:

  1. 向客户端添加标头将全部解释为 UTF-8,没有变化。

    header('content-type: text/html; charset=utf-8');

  2. 回显下面的编码字符:(它们向客户端正确显示为:ä ö ü ß €。)

    "\xc3\xa4"."\xc3\xb6"."\xc3\xbc"."\xc3\x9f"."\xe2\x82\xac";

  3. 为 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,它们看起来是相同的),它也无法转换。

标签: php mysql utf-8 iis-8


【解决方案1】:

看起来您的数据库是以拉丁 1 编码而不是 UTF8 存储的,快速修复应该是使用以下语法:

<?php
echo html_entity_decode($row['prompt'],ENT_COMPAT | ENT_HTML401,'ISO-8859-1');

真正的解决方法是修复您的数据库,以 UTF8 存储数据,并让您的所有工具链都使用 UTF8。

html_entity_decode() 自 PHP 5.4 起将 UTF8 作为默认编码: http://fr2.php.net/manual/en/migration54.other.php

【讨论】:

    【解决方案2】:

    Pascalc 打败了我:


    在 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');
    

    【讨论】:

      猜你喜欢
      • 2016-02-03
      • 2014-02-21
      • 2011-06-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-23
      • 1970-01-01
      • 2010-12-17
      相关资源
      最近更新 更多