php - 字符如何通过表单传输?

标签 php html forms unicode encoding

<head>
<meta charset="ISO-8859-7">
</head>

我一直在使用表单并看到 <meta charset="ISO-8859-7">标记对将在文本区域内键入的文本进行编码。用于存储文件的编码方法没有做到这一点。

我看到如果输入的字符不是 <meta charset="ISO-8859-7"> 指定的编码的一部分标记,字符将为 referenced (&#D;)

我假设表单从指定的编码发送字节序列。 因为如果我输入一个字符,无论它是什么,都将是一个编码将解释的字节。

例如 <meta charset="ISO-8859-7"> 我在表格中输入字符 "¥"

此字符不是编码的一部分,但它必须作为它代表 A5 的位置的字节发送,不管能不能表示(这个一般是什么编辑器做的)。

但不是,表单不将其作为字节发送,而是字符是 referenced .

代码:

index.php:

<?php header('Content-Type: text/html; charset=ISO-8859-7'); ?>

<head>
    <meta charset="ISO-8859-7">
</head>
<form method="post" action="encode.php" accept-charset="ISO-8859-7">
    <p><textarea name="input" maxlength="10" rows="5" cols="100"></textarea></p>
    <p><button>Submit</button></p>
</form>

encode.php:

<head>
    <meta charset="ISO-8859-7"><!-- Useless, Even if is specified the ISO-8859-1 where the "¥" exist, the form sended a reference char rather an a byte to interpret.-->
</head>
<?php
    $input=$_POST["input"];
    var_dump($input);
?>

源代码中的结果:

string(6) "&#165;"

注意:我已经测试过更改用于存储文件的编码。

index.php 中: 不管使用什么编码来存储文件,表单总是会相应地发送 accept-charset=""属性或与 <meta charset="">标记如果 accept-charset=""未指定。

还有 encode.php: 该字符串从不由文件编码。可以工作和表示,但用于存储文件的编码与此无关。

最佳答案

问题是表单编码不支持键入的字符。

据我所知,如果用户在表单编码不支持的表单字段中输入字符,HTML 4 和 HTML 5 都没有指定浏览器应该做什么。

HTML 5 是否指定在 URL 的查询部分¹(以及因此在 GET 表单提交中?)不支持的字符应替换为 ASCII ,但我可以' 为 POST 表单找到任何东西。

似乎所有浏览器(或至少 IE、FF、Chrome、Opera)都同意将不受支持的字符编码为 XML 实体。 (更好的方法可能是警告用户并阻止提交表单,但这是桥下的水。)

解决方案当然是一路使用UTF-8。那么编码支持所有的字符,就不会出现这个问题。


¹ 2.6.3 Resolving URLs. HTML 5, W3C Working Draft 25 May 2011 , 项目 8.1:

If the character in question cannot be expressed in the encoding encoding, then replace it with a single 0x3F octet (an ASCII question mark) [...]

有趣的事实:以上仅适用于 IRIquery 部分(问号后的部分) . 路径 部分始终 使用 UTF-8 编码。主机名当然是使用 Punycode 编码的.令人难以置信。

关于php - 字符如何通过表单传输?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6783233/

相关文章:

javascript - 悬停时获取值会产生 "undefined"

php - simplexml 可以用来通过 html 来复枪吗?

php - 在 wp_insert_post_data 上的过滤器中获取自定义字段值

php - Symfony 4 TextType required = false 获取 "string"类型的预期参数,给定 "NULL"

PHP - 拦截 POST 请求

javascript - 如何使用 javascript 处理 HTML <forms>

javascript - 基于深层 child 文本内容的 jQuery 选择器

javascript - 无法在html中为文本框加水印

JQuery .text不会出现在浏览器中,仅出现在firebug中,不会被发布

javascript - 数组未保存在本地存储中