我知道有很多关于此问题的相关主题,但我无法解决其中任何一个问题。
我有一个带有单词的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 ,在输出之前我有header("Content-Type: text/html; charset=UTF-8");
在PHP文件的开头使用ini_set('default_charset', 'UTF-8');
什么都不做。
所以,问题是 - 我怎样才能真正正确地输出单词?我也想知道为什么utf8_encode()
将输出从错误(UTF-8)更改为不同的错误(仍然是UTF-8)所以我实际上已经了解了这个叫做编码的混乱。
答案 0 :(得分:2)
问题是由于在字符串上使用strtolower
造成的。
显然PHP5 is not UTF-8 compatible和常规字符串操作不适用于多字节字符。
解决方案是使用mb_strtolower
(documentation)代替UTF-8编码。
更多信息:Function Overloading Feature(由Blablaenzo提供)
感谢georg的the answer!