在使用特殊字母的语言中,字符编码总是有点棘手。
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”),但它没有改变任何东西。
我真的想知道数据编码的时间和方式是什么?
谢谢
PS 2:这是我对mb_detect_encoding
的结果ASCII ESSAI
ASCII 34
ASCII Bonjour
ASCII 41
UTF-8 ���������������
和来自DOMElement的警告:警告:DOMElement :: setAttribute()[domelement.setattribute]:字符串不是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)但是值已经以某种方式改变了
答案 0 :(得分:0)
如上所述7位ASCII是UTF-8的子集,因此“Bonjour”被检测为ASCII,“café,3€”被视为UTF-8(尽管你会看到“caf”和“,3”)。
将从SQL填充的变量立即传递给DOMElement(不带utf8_encode
)应该工作。
答案 1 :(得分:-1)
我用PDO替换了mysqli
有效。 utf8字符串未更改...
所以问题出在mysqli上(不要再使用它了)
@deceze:你可以检测到charset,当一切设置正确时它会很好用