1

我正在处理 MySQL 数据库中的替换字符......如果它留在那里很好,但我正在尝试编辑它。我的表单将字符显示为带有问号 (�) 的菱形。所以我提交了表单,我比较了表单上的数据和数据中的数据,看看它是否发生了变化。这里的问题是,当我提交表单时,它会将替换字符变成& #65533;这是 html 实体等价物,所以当发生这种情况时,比较失败,代码认为字符串已经改变——它有,但不是真的。我尝试使用不同的方法,在比较时将替换字符转换为数据库中的 html 实体等价物——它开始将另一个看似正常的字符变成另一个替换字符 html 实体等价物——然后将 html 实体进入替换字符——这根本不起作用——但它们都失败了。是的,我已经尝试过 html_entity_decode() 和 htmlspecialchars_decode()

我的问题是:如何防止替换字符变成 html 实体?

4

2 回答 2

2

请验证您的 html 上的编码(例如)

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

并在您的数据库上(例如在 MySQL 中)

DEFAULT CHARACTER SET <your_charset> COLLATE <your_collate>

它必须相等。

于 2012-04-09T05:28:31.387 回答
1

出于某种原因,网络浏览器正在提交 � REPLACEMENT CHARACTER (U+FFFD),因为它是十进制的数字 HTML 实体:&#65533;。可能您已经以这种方式将其输出到浏览器?

但是,如果您希望输入包含 HTML 实体,如果您不想将它们作为 HTML 存储到数据库中,则需要对它们进行解码。要解码传入的 UTF-8 编码字符串中的数字实体$str

$convmap = array (0, 0x10FFFF, 0, 0xFFFFFF);
$output = mb_decode_numericentity($str, $convmap, 'UTF-8');

此代码确实执行了您正在寻找的转换 ( Demo ),但是您应该首先澄清为什么要提交数字 HTML 实体。

由于您更喜欢 unicode,我建议您对网页使用 UTF-8:

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

对于形式:

<form action="" method="post" accept-charset="utf-8">

祝你好运。

于 2012-04-10T14:35:48.927 回答