【问题标题】:PHP $_POST doesn't take accentsPHP $_POST 不带重音符号
【发布时间】:2013-04-13 10:11:49
【问题描述】:

这个问题已经解决了,查看我的答案看看解决方案


我正在尝试通过 html 表单向我的数据库添加带有重音字母的文本,该表单通过 POST 提交到 PHP 页面,问题是重音字母被转换为不可读的字符。

我有这个表格:

<form action="page.php" method="POST">
    <input type="textarea" id="text1" name="text1" />
    <input type="submit" value="Send" />
</form>

然后,在 page.php 中:

echo $_POST['text1'];

问题是,如果我在我的 textarea 中输入 àèìòù 然后我提交表单,我会得到这个输出:

à èìòù

我的下一步是将重音字母转换为带有htmlentities($_POST['text1'] 的html 实体,但我需要$_POST 给我正确的字母。

注意:在我已经拥有的页眉中

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

我该如何解决这个问题?

编辑

我试过了

<form action="page.php" method="POST" accept-charset="UTF-8">
    <input type="textarea" id="text1" name="text1" />
    <input type="submit" value="Send" />
</form>

它并没有解决它

编辑 2

也尝试添加

<meta charset='utf-8'>

到我的文档的头部,它不起作用

编辑 3

我也尝试在第二页上将我的字符集设置为 UTF-8,并且

echo $_POST['text1'];

显示正确的结果。

我看到问题在于我使用 htmlentities 时,使用此代码

echo htmlentities($_POST['text1']);

我明白了

&Atilde;&nbsp;&Atilde;&uml;&Atilde;&not;&Atilde;&sup2;&Atilde;&sup1; 

实际输出的

à èìòù 

即使我也在元标记和标题中设置了字符集。有谁知道我该如何解决?

【问题讨论】:

标签: php html post html-entities


【解决方案1】:

好的,我终于解决了。即使我正在设置字符集,无论是否使用 PHP 标头设置它

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

或带有 HTML 元标记

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

并将我的文件保存为 UTF-8,但它不起作用。

输入àèìòù 然后用htmlentities 处理它总是会导致

&Atilde;&nbsp;&Atilde;&uml;&Atilde;&not;&Atilde;&sup2;&Atilde;&sup1; 

用“可读”字符表示的是:

à èìòù

我刚刚改了这个:

echo htmlentities($_POST['text1']);

到这里:

echo htmlentities($_POST['text1'], ENT_QUOTES, "UTF-8");

一切正常,我打印出我的真实输入。

感谢大家的帮助!

【讨论】:

    【解决方案2】:

    我将采用另一种方式 - 添加到您的 PHP 代码 &lt;?php header("Content-Type: text/html; charset=utf-8"); ?&gt;。保存有元标记(一些浏览器随便忽略...)

    根据您提供的编码表示,PHP 正在回显一个 UTF-8 编码的字符串,而您的浏览器假定输出将是 ISO-8859-1。设置该标头将使 所有 浏览器理解 UTF-8 是预期的,前提是它们在 Accept-encoding 下拥有它。如果他们不这样做,他们就会呕吐,但我只知道一种“现代”浏览器不这样做,它大约占市场的 0.2%。

    请注意,您需要首先在任何其他输出之前抛出该行(或者您可以输出缓冲很多,这让生活更轻松,但有点消耗更多内存)

    【讨论】:

    • 你会想到哪种浏览器?
    • 顿悟。仅适用于 linux,即使那样,我也不确定它是否已经修复。
    • 您知道 HTML 元标记仅适用于服务器不发送 HTTP 标头的情况吗?有些服务器默认情况下不这样做,有些服务器会指定默认的内容类型和编码,这会禁用 HTML 中的任何 &lt;META&gt;
    • @Sven:你为什么认为我建议抛出一个标题,而不必担心元标记和一些浏览器随便忽略它们? :-)
    猜你喜欢
    • 2010-11-28
    • 1970-01-01
    • 1970-01-01
    • 2012-05-14
    • 2023-04-04
    • 2017-03-03
    • 1970-01-01
    • 2019-12-08
    • 1970-01-01
    相关资源
    最近更新 更多