带有html_entity_decode和IIS8的PHP 5.5

时间:2013-09-04 15:26:57

标签: php mysql utf-8 iis-8

我们最近从使用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

我尝试了以下内容:

  1. 向客户端添加标头将所有内容解释为UTF-8,无需更改。

    标题('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添加编码选项。没有变化。

  4. 有什么想法吗?代码打击。

    <?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);
    

2 个答案:

答案 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');