【发布时间】:2014-11-03 09:00:38
【问题描述】:
我知道有很多关于此问题的相关主题,但我无法解决其中任何一个问题。
我有一个包含单词的 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 without BOM 并且在输出之前我有header("Content-Type: text/html; charset=UTF-8");
在 PHP 文件的开头使用 ini_set('default_charset', 'UTF-8'); 没有任何作用。
所以,问题是 - 我如何才能正确输出单词? 我也想知道为什么 utf8_encode() 将输出从错误 (UTF-8) 更改为不同的错误(仍然是 UTF-8)所以我实际上会了解一些关于这种混乱的东西,称为编码。
【问题讨论】:
-
您的文件是 UTF-8 而不是 ANSI?
-
是的,我所有的文件都设置为没有 BOM 的 UTF-8。
-
您的数据看起来像
strtolower已应用于 utf8 字符串。你这样做了吗? -
在处理多字节编码(如 UTF-8)时,可行的方法是使用 mb_* 变体,如“mb_strtolower”。有关使用 unicode 的参考:joelonsoftware.com/articles/Unicode.html 和 php.net/manual/en/mbstring.overload.php
-
@Paul Tomkiel 感谢您的提醒!我认为回答我自己的问题会很愚蠢(尤其是当其他人提供了答案时!)但由于它已经很长时间了,最好将它放在已回答的列表中。