<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) "¥"
注意:我已经测试过更改用于存储文件的编码。
在 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) [...]
有趣的事实:以上仅适用于 IRI 的query 部分(问号后的部分) . 路径 部分始终 使用 UTF-8 编码。主机名当然是使用 Punycode 编码的.令人难以置信。
关于php - 字符如何通过表单传输?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6783233/