如何使用PHP正确处理MYSQL数据库的UTF8结果?

时间:2016-09-12 11:10:06

标签: javascript php mysql unicode utf-8

几天后,我一直在寻找一种能在我身上显示UTF8的解决方案 网页。 目前造成问题的字符是į(unicode:\ u012f decimal:303)但是, 我的数据库中有超过10,000条记录,我不能保证所有其他记录都正确显示。 所以我正在寻找一个涵盖所有角色的解决方案。

į显示为?在HTML中。

我的设置是一个HTML页面,它使用AJAX向PHP文件发送请求。 PHP然后查询MYSQL数据库以查找特定条目, 然后它从该条目中获取立陶宛语单词并将其作为对AJAX的响应。 回到Javascript,响应被设置为HTML元素的innerHTML。 此当前设置不使用JQuery。

以下是我尝试解决问题的进展。

首先,我确认我使用的所有文件都已正确编码为UTF8,而不是UTF8BOM。

然后我在phpMyAdmin中打开MYSQL数据库来查看条目。 看到字符被替换?在条目中,我做了一些研究,发现数据库有错误的整理。 将数据库/表的排序更改为utf8_general_ci之后没有任何更改,因此我进一步调查并发现为表的各列更改它是另一种解决方案。 这工作正常,我的数据库现在正确显示字符。

接下来,我的网页中不会显示字符š(unicode:\ u016​​1十进制:353), 我使用PHP中的以下代码修复了这个问题,我在stackoverflow上找到了它。

function encode_string($string){ 
    $encoded = ""; 
    for ($n=0;$n<strlen($string);$n++){ 
        $check = htmlentities($string[$n],ENT_QUOTES); 
       $string[$n] == $check ? $encoded .= "&#".ord($string[$n]).";" : $encoded .= $check; 
    } 
    return $encoded; 
} 

我不能说我完全理解这段代码但它导致角色š在到达我的HTML时正确显示。 然而,这对角色į不起作用。

我还尝试$conn->set_charset('utf8');设置连接以使用utf8但是这会导致显示į 相反,$conn->query("SET NAMES UTF8;");

的结果相同

我发现将hard硬编码到Javascript或PHP中,允许它被发回并正确显示,例如echo "į";有效。 所以我认为这个问题可能与回声之前的数据库或PHP有关。 但是,我没有识别问题的知识。

以下是我的php代码:

<?php
header('Content-Type: text/html charset=utf-8');
//Connection to database is made. Referred to as $conn

$sql = "SELECT * FROM Words";
$result = $conn->query($sql);

if ($result->num_rows > 0) {

    //Loop through the results to find a word with the status of 1
    while($row = $result->fetch_assoc()) {

        $status = $row["status"];

        if($status == 1){
            //respond to AJAX with the word

            $ltword = trim($row["lt"]);


            echo utf8_encode(encode_string($ltword));
            //Has also been tested as 
            //echo encode_string($ltword);
            //with no noticeable difference.


            break;
        }
    }

}


function encode_string($string){ 
    $encoded = ""; 
    for ($n=0;$n<strlen($string);$n++){ 
        $check = htmlentities($string[$n],ENT_QUOTES); 
       $string[$n] == $check ? $encoded .= "&#".ord($string[$n]).";" : $encoded .= $check; 
    } 
    return $encoded; 
}

?>

核心问题是,鉴于我目前的设置, 如何从我的数据库中正确获取编码的UTF8字符以显示在我的网页上?

编辑: php的mb_check_encoding()函数验证从数据库接收的数据是否有效。

php.ini正在使用utf8作为它的默认字符集。

使用$conn->character_set_name();返回结果latin1。 使用$conn->set_charset("utf8");会导致它返回utf8,但是然后į显示为į仍然不正确。

3 个答案:

答案 0 :(得分:0)

在你的情况下问题是整理,后来修改了。作为一种好的做法,尝试设置表格排序以及列排序相同即。 utf8_unicode_ci(一般来说速度更快,但unicode对于排序/显示更好)。

现在回到问题,问题在于已添加的数据由于不正确的整理而存储错误。为此你需要看&amp;解决方法,因为你不能确定它是否正确存储。

答案 1 :(得分:0)

如果你正在使用mysqli,你可以调用set_charset():

$mysqli->set_charset('utf8mb4');       // object oriented style
mysqli_set_charset($link, 'utf8mb4');  // procedural style

答案 2 :(得分:0)

如果您有端到端的UTF8(db&gt;连接&gt; php),则不必回显utf8_encode。只需回显变量即可正确显示。

最有可能的是,该字符在数据库中混乱,因为它仍然是原始编码。尝试使用本机UTF8字符更新数据库的内容,因为已经修复了排序规则并且它应该可以正常工作。

所以最喜欢你也需要$ conn-&gt; set_charset('utf8')。