php mysql字符集:存储国际内容的html

时间:2009-03-25 11:46:27

标签: php mysql character-encoding

我完全被我读到的有关字符集的内容所困惑。我正在开发一个接口来存储在mysql数据库中以html格式化的法语文本。

我所理解的是,正确显示所有法国特殊字符的安全方法是将它们存储为utf8。所以我创建了一个mysql数据库,为数据库和每个表指定了utf8。 我可以通过phpmyadmin看到字符的存储方式完全符合预期。但是通过php输出这些字符会给我带来不稳定的结果:重音字符被无意义的字符所取代。那是为什么?

我必须使用utf8_encode或utf8_decode吗?注意:html页面字符编码设置为utf8。

更一般地说,存储这些数据的安全方法是什么?我应该在保存时结合htmlentities,addslashes和utf8_encode,并在输出时使用stripslashes,html_entity_decode和utf8_decode吗?

4 个答案:

答案 0 :(得分:11)

MySQL即时执行字符集转换,称为connection charset。您可以使用sql语句

指定此charset
SET NAMES utf8

或使用特定的API函数,例如mysql_set_charset()

mysql_set_charset("utf8", $conn);

如果正确完成,则无需使用utf8_encode()和utf8_decode()等函数。

您还必须确保浏览器使用相同的编码。这通常使用简单的标题来完成:

header('Content-type: text/html;charset=utf-8');

(请注意,charset在浏览器中称为 utf-8 ,但在MySQL中称为 utf8 。)

在大多数情况下,连接字符集和网络字符集是您需要跟踪的唯一内容,因此如果它仍然无效,则可能还有其他错误。尝试一下,通常需要一段时间才能完全理解。

答案 1 :(得分:2)

我强烈建议您阅读Joel Spolsky撰写的这篇文章"The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!)",了解您在做什么以及为什么。

答案 2 :(得分:1)

考虑PHP生成的前端和MySQL后端单独的组件是很有用的。 MySQL不应该担心显示逻辑,PHP也不应该假设后端对数据进行任何类型的预处理。

我的建议是使用utf8编码将数据存储为普通字符,并使用MySQL方法转义任何危险字符。 PHP然后从数据库读取utf8编码数据,处理它们(通常使用htmlentities()),并通过您选择使用的模板显示它。

Emil H.正确建议使用

 SET NAMES utf8

这应该是你建立MySQL连接后调用的第一件事。这使得MySQL将所有输入和输出视为utf8。

请注意,如果必须使用utf8_encode或utf8_decode函数,则不能正确设置html字符编码。最简单的要求系统的每个组件都使用utf8,因为这样你就不必进行手动编码/解码,这可能导致以后很难跟踪问题。

答案 3 :(得分:0)

除了Emil H所说的内容之外,您还需要在页面head标记中添加此内容:

<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />