【问题标题】:Corrupted characters posted to PHP via HTML form通过 HTML 表单发布到 PHP 的损坏字符
【发布时间】:2012-01-26 20:28:58
【问题描述】:

我知道这一定是一个相对简单的问题,但谷歌让我失望了。假设我有以下简单的 PHP 文档(没有讨论安全性、SQL 注入、XSS 等。这只是一个简单的例子来说明我的编码问题):

<?php
if(!empty($_POST['message'])) {
    file_put_contents($filename, $_POST['message']);
}
?>
<!DOCTYPE html>
<html>
<head><meta http-equiv="content-type" content="text/html;charset=utf-8"/></head>
<body>
<form method="post" action="?">
    <textarea name="message">
    <?php echo htmlentities(file_get_contents($filename))?>
    </textarea>
    <input type="submit"/>
</form>
</body>
</html>

现在,我在表单中输入 Σ 并提交。当页面重新加载时,textarea 会填充 Σ 而不是 Σ

我理解为什么会这样(在一定程度上),但我不知道如何修复帖子以阻止它发生。有什么想法吗?

【问题讨论】:

  • 您的数据库是否以 UTF-8 格式保存?
  • 无数据库。文件。虽然我确信如果我保存到数据库也会发生同样的情况。

标签: php html encoding utf-8


【解决方案1】:

htmlentities 默认假设 ISO-8859-1 作为输入,但你输入的是 utf-8...,所以正确的方法是 htmlentities($string, ENT_COMPAT,"UTF-8");

在这种情况下,我宁愿选择htmlspecialchars,但不需要其他实体。

【讨论】:

  • 没有意识到htmlentities 是这样工作的。使用htmlspecialchars,它就像一个魅力,并且考虑到我使用它的目的,它是正确调用的函数。谢谢
【解决方案2】:

我看到您正在向文件中添加文本,然后将该文件拉回。向文件中添加信息时,您是否尝试过使用utf8_encode()

 file_put_contents($filename, utf8_encode($_POST['message']));

【讨论】:

  • 不幸的是,这给了我 ã
  • 您是否尝试删除htmlentities()
  • 有趣的是...utf8_decode 可以工作...但最好告诉htmlentities 你有一个实际的 utf8 字符串...我的经验法则通常是:如果你提供 utf- 8,而您在代码中的任何位置都有utf8_encodeutf8_decode,实际上是有问题。
猜你喜欢
  • 2022-06-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-28
  • 1970-01-01
  • 2023-02-18
相关资源
最近更新 更多