我有一个带有单词的MySQL表,其中一些可以包含斯堪的纳维亚字母,例如å,ä和ö.当我使用echo或print_r()输出它们时,输出始终为 .我尝试使用utf8_encode(),它显示了不同的无效结果.使用mb_detect_encoding(),我注意到包含这些字母的单词的编码已经是UTF-8.
示例词:
A = the word (and expected output)
B = echo word
C = echo utf8_encode(word)
D = mb_detect_encoding(word)
E = mb_detect_encoding(utf8_encode(word))
+-------+-------+-------+-------+-------+
| A | B | C | D | E |
+-------+-------+-------+-------+-------+
| word | word | word | ASCII | ASCII |
| työ | ty� | ty㶠| UTF-8 | UTF-8 |
| ylä | yl� | yl㤠| UTF-8 | UTF-8 |
+-------+-------+-------+-------+-------+
我所有MysqL表的排序规则设置为utf8 – utf8_swedish_ci,初始化PDO时我有
$dbh = new PDO("MysqL:host=xxxx;dbname=yyyy;charset=utf8", "zzzz", "****");
$dbh->setAttribute(PDO::MysqL_ATTR_INIT_COMMAND, "SET NAMES 'utf8'");
此外,我的所有文件的编码设置为UTF-8而没有BOM,在输出之前我有标题(“Content-Type:text / html; charset = UTF-8”);
使用ini_set(‘default_charset’,’UTF-8′);在PHP文件的开头什么都不做.
所以,问题是 – 我怎样才能真正输出正确的单词?我还想知道为什么utf8_encode()将输出从错误(UTF-8)更改为不同的错误(仍然是UTF-8),所以我实际上学到了一些关于这个叫做编码的混乱.
解决方法:
问题是由于在字符串上使用strtolower引起的.
显然PHP5 is not UTF-8 compatible和常规字符串操作不适用于多字节字符.
解决方案是使用mb_strtolower(documentation)而不是UTF-8编码.
更多信息:Function Overloading Feature(Blablaenzo提供)
谢谢georg the answer!
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。