【问题标题】:Encoding issue storing HTML in mySQL using PHP使用 PHP 在 mySQL 中存储 HTML 的编码问题
【发布时间】:2011-12-30 13:33:36
【问题描述】:

我已经构建了一个允许将 HTML 存储在数据库中的 CMS。一切开始都很简单。我使用 htmlspecialchars 在文本区域中显示了 HTML,以防止它破坏表单。然后使用 html_specialchars_decode 将其保存回来。在有人将一些 HTML 粘贴到系统中而不是打字之前,这一切似乎都运行良好。此时它存储得很好,但丢失了大部分空白,这意味着所有可爱的缩进都必须从头开始。

为了解决这个问题,我尝试使用 utf-8 编码指定所有内容,因为任何尝试修改它似乎都会产生无效字符。

我在 PHP 标头中指定了 utf-8

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

我在我的 HTML 页面中指定了 utf-8

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

我在 HTML 表单中指定 utf-8

<form accept-charset="utf-8" 

然后我(基本上)像这样读取发布的值:

$Val = $_POST[$SafeFieldName];

我的理解是 PHP 在 utf-8 中做了所有事情,所以在这个阶段我有点惊讶我得到 gobbledegook - 除非我现在这样做:

$Val = utf8_decode($Val);

所以,在这个阶段——它起作用了——有点。我失去了所有可爱的缩进,但不是所有的空白。就好像有一些非 utf8 字符被剥离了。奇怪的是我正在使用 Chrome,但在 Firefox 中,它似乎很好

我想我现在只是在打结。有什么优雅的建议吗?我需要深入了解这一点,而不是仅仅破解它以使其工作。

【问题讨论】:

  • 空白字符(换行符、制表符、回车符)在任何字符集中都应该相同。 Unicode 不匹配根本不应该影响空格。在表单提交或构建之后,您是否正在处理 html? DOM 操作、Tidy 等...?

标签: php utf-8 character-encoding content-type invalid-characters


【解决方案1】:

排序 - 答案真的很尴尬 - 但你永远不知道,总有一天有人可能需要这个 :)

我注意到它在 Firefox 中的工作方式有所不同(但仍然相当垃圾),所以我查看了我的样式表并发现了这个:

white-space: nowrap;

一定是有人(我)把它放在那里试图让水平滚动在某些浏览器中工作。没有它,HTML 会一直到达 DB 并再次返回。

我唯一的另一个问题是为什么我需要这个,因为整个事情应该已经到达 utf8

$Val = utf8_decode($Val);

神奇地 - 现在我不需要它了。

【讨论】:

    【解决方案2】:

    与数据库的连接和数据库表本身应支持 UTF-8。确保您的表的排序规则是 utf8_general_ci 并且表中的所有字符串字段也具有 utf8_general_ci 排序规则。

    数据库连接也应该是 UTF-8:

    mysql_set_charset('utf8');
    

    请参阅http://akrabat.com/php/utf8-php-and-mysql/ 了解更多信息。

    更新:一些报告

    mysql_query('SET NAMES utf8');
    

    有时也需要!

    如果无法将您的表格和连接设为 UTF-8,您当然可以将 HTML 保存为 BASE64 编码数据,并在再次从数据库中检索时将其解码。

    【讨论】:

      【解决方案3】:

      如果这是 MySQL 内外的问题(正如您在标题中建议的那样),那么您需要确保列和表是 UTF8-BIN 并在打开与 MySQL 的连接后输入mysql_set_charset('utf8');

      【讨论】:

        【解决方案4】:

        检查您的数据库连接编码,并检查您存储 HTML 的数据库表字段编码。 也许那里的编码不同于UTF-8

        【讨论】:

        • 我也搞砸了,但它似乎没有任何效果。目前是文本,utf8_unicode_ci
        猜你喜欢
        • 2013-05-23
        • 2011-04-30
        • 2010-12-15
        • 1970-01-01
        • 2013-04-25
        • 1970-01-01
        • 1970-01-01
        • 2010-09-29
        • 1970-01-01
        相关资源
        最近更新 更多