1

我已经构建了一个允许将 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 中,它似乎很好

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

4

4 回答 4

3

与数据库的连接和数据库表本身应支持 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 编码数据,并在再次从数据库中检索它时将其解码回来。

于 2011-11-16T15:54:00.080 回答
0

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

于 2011-11-16T15:49:43.160 回答
0

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

于 2011-11-16T15:51:50.983 回答
0

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

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

white-space: nowrap;

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

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

$Val = utf8_decode($Val);

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

于 2011-11-17T10:13:27.627 回答