问题:
当我从 MySQL 表中检索值到我的 PHP Zend 框架应用程序时,字符 ä 和 ö 会从数据库返回到我的浏览器,如下所示。
任何可能出现问题的想法?我已经尝试将一些属性设置为 UTF-8,但仍然会发生这种情况......我想我仍然错过了一些东西。
您能否提供一些解决方案,我如何才能确定地摆脱这种情况?我需要设置什么配置等。
谢谢 :)
当浏览器读取错误编码的字符时,它们会显示为 � 或 ?。某处存在编码不匹配:
这些字符可以在 Unicode UTF-8 中使用,因此您应该验证您的数据库表排序规则是utf8_bin
或类似的,因为如果您想以 UTF-8 瑞典语存储所有内容,您可以使用utf8_swedish_ci
在您的浏览器中,确保您的内容编码设置为自动检测。
在 MySQL 中创建一个 UTF-8 / utf8_bin 表,这里是一个例子:
CREATE TABLE `sample` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
要更改现有表以使用 UTF-8,请使用以下命令:
ALTER TABLE table_name CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin;
这篇文章很好地解释了是否使用CONVERT TO CHRACTER SET utf8
注意CHARSET
和COLLATE
都必须设置,否则会自动获取COLLATE=utf8_general_ci
对于 HTML,可以使用以下方式设置字符集:
<meta charset="UTF-8">
我建议您查看浏览器中设置的“网站编码”。
如果网站不提供编码并且您的 mysql/php 正在“正确”处理它,这可能会发生(例如,它设置为“western 1252”但需要 utf8/unicode)
在 Firefox 中,您可以通过视图 -> 编码(或类似方法)查看编码
您只需将编码正确设置为 UTF-8。以下是最小工作解决方案的基本步骤:
header('Content-type: text/html; charset=utf-8');
指定编码)php.ini
没有覆盖编码。如果您有外部.htaccess
文件,请检查它们是否也没有。如果您正确处理 UTF-8,则不需要utf8_encode
/utf8_decode
等htmlentities
,并且无需特殊处理即可正确输出重音字符。
注意:某些语言环境不是由 UTF-8 处理的,尤其是Thaï。
关于Zend_Db_Adapter_Pdo_Mysql确保您的构造函数使用UTF-8,如下所示:
$your_pdo = Zend_Db::factory('Pdo_Mysql', array(
'host' => DATABASE_HOST,
'username' => DATABASE_USERNAME,
'password' => DATABASE_PASSWORD,
'dbname' => DATABASE_DBNAME,
'options' => array( 'charset' => 'utf8' )
) );
在HTML中使用数据转义之前:
return htmlspecialchars( $string, ENT_QUOTES, 'UTF-8' );
查看有关内容类型、文件编码等的所有其他答案。