0

在具有特殊字母的语言中,字符编码总是有点棘手。

MySQL 数据库服务器采用 UTF-8 Unicode (utf8)

排序规则是 utf8-general-ci

什么时候,使用 mysqli,我从数据库中获取一些数据:

while($row = $result->fetch_assoc()){
    foreach ($row as $field=>$value){
        print(mb_detect_encoding($value).' '.$value."<br/>");
    }
}

字符编码为 ASCII 而不是 UTF-8。它从何而来 ?

更多信息:我的 Apache AddDefaultCharset 是 utf-8

html 页面的编码字符集是 utf-8

我使用从另一个 utf-8 数据库导出的脚本构建数据库

PS:我尝试了 mysqli_set_charset($mysqli, "utf8") 但它没有改变任何东西。

我真的很想知道数据何时以及如何进行 ASCII 编码?

谢谢

PS 2:这是我使用 mb_detect_encoding 得到的结果

ASCII ESSAI
ASCII 34
ASCII Bonjour
ASCII 41
UTF-8 ���������������

以及来自 DOMElement 的警告:警告:DOMElement::setAttribute() [domelement.setattribute]: string is not in UTF-8

PS 3:问题出在 UTF-8 数据上。

在数据库中我有èèèèèèèèèèèèèèèèèèèèèè

如果我在字符串周围使用 utf8_encode,我没有更多问题,结果如下:

ASCII ESSAI
ASCII 34
ASCII Bonjour
ASCII 41
UTF-8 èèèèèèèèèèèèèèè
ASCII 43

所以很明显我的 utf8 字符串是一个 utf8 字符串(参见 mb_detect_encoding)但是值已经以某种方式改变了

4

2 回答 2

0

如前所述,7 位 ASCII 是 UTF-8 的子集,因此“Bonjour”被检测为 ASCII,“café, 3€”被检测为 UTF-8(尽管您会看到“caf”和“, 3”)。

将一个从 SQL 填充的变量立即传递给 DOMElement(不带utf8_encode应该可以工作。

于 2013-09-27T14:55:37.357 回答
-1

我用 PDO 替换了 mysqli

有用。utf8 字符串没有改变...

所以问题出在mysqli上(不要再使用它了)

@deceze:您可以检测字符集,并且在一切设置正确时效果很好

于 2013-09-27T16:26:16.893 回答