【问题标题】:Scandinavian letters (å ä ö) not displaying correctly斯堪的纳维亚字母 (å ä ö) 无法正确显示
【发布时间】:2014-11-03 09:00:38
【问题描述】:

我知道有很多关于此问题的相关主题,但我无法解决其中任何一个问题。

我有一个包含单词的 MySQL 表,其中一些可以包含斯堪的纳维亚字母,例如 å、ä 和 ö。当我简单地使用echoprint_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.htmlphp.net/manual/en/mbstring.overload.php
  • @Paul Tomkiel 感谢您的提醒!我认为回答我自己的问题会很愚蠢(尤其是当其他人提供了答案时!)但由于它已经很长时间了,最​​好将它放在已回答的列表中。

标签: php mysql encoding utf-8


【解决方案1】:

问题是由在字符串上使用strtolower 引起的。

显然PHP5 is not UTF-8 compatible 和常规字符串操作不适用于多字节字符。

解决方案是使用 mb_strtolower (documentation) 代替 UTF-8 编码。

更多信息:Function Overloading Feature(由Blablaenzo提供)

感谢georg the answer

【讨论】:

    猜你喜欢
    • 2016-06-08
    • 2013-04-14
    • 2018-11-14
    • 2014-06-10
    • 2012-03-29
    • 1970-01-01
    • 2018-08-14
    • 1970-01-01
    • 2016-04-10
    相关资源
    最近更新 更多