nEA*_*nam 5 html php forms unicode encoding
<head>
<meta charset="ISO-8859-7">
</head>
Run Code Online (Sandbox Code Playgroud)
我一直在使用表单,并看到<meta charset="ISO-8859-7"> 标签编码将在文本区域中键入的文本.事情是用于存储文件的编码方法不是.
我已经看到如果输入的字符不是<meta charset="ISO-8859-7">标签所规定的编码的一部分,则会引用该字符(D;)
我假设表单是从编码speciefied发送字节序列.因为如果我键入一个字符,它将是一个编码将解释的字节.
例如,使用<meta charset="ISO-8859-7">
i在表单中键入字符"¥"
此char不是编码的一部分,但它必须作为它所代表的位置的一个字节发送A5,无论它是否可以表示(这通常由任何编辑器生成).
但不是,表单不会将其作为字节发送,而是引用该字符.
码:
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>
Run Code Online (Sandbox Code Playgroud)
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);
?>
Run Code Online (Sandbox Code Playgroud)
源代码中的结果:
string(6) "¥"
Run Code Online (Sandbox Code Playgroud)
注意:我已经测试过更改用于存储文件的编码.
在index.php中:无论使用什么编码来存储文件,表单总是会相应地使用accept-charset=""属性或<meta charset="">标签发送(如果accept-charset=""未指定).
并使用encode.php:该字符串永远不会被文件编码.可以工作和表示,但用于存储文件的编码与此无关.
问题是表单编码不支持键入的字符。
\n\n据我所知,如果用户在表单字段中输入表单编码不支持的字符,HTML 4 和 HTML 5 都没有指定浏览器应该执行的操作。
\n\nHTML 5确实指定在 URLs\xc2\xb9 的查询部分中应将不支持的字符替换为 ASCII ?(因此在 GET 表单提交中?),但我找不到 POST 表单的任何内容。
似乎所有浏览器(或者至少 IE、FF、Chrome、Opera)都同意将不支持的字符编码为 XML 实体。(更好的方法可能是警告用户并阻止表单提交,但这只是过桥之事。)
\n\n解决方案当然是一路使用UTF-8。那么所有的字符都被编码支持了,就不会出现这个问题了。
\n\n\xc2\xb9 2.6.3 解析 URL。HTML 5,W3C 工作草案,2011 年 5 月 25 日,第 8.1 项:
\n\n\n\n\n如果有问题的字符无法用编码编码表示,则将其替换为单个 0x3F 八位字节(ASCII 问号)[...]
\n
有趣的事实:以上仅适用于IRI的查询部分(问号后面的部分)。路径部分始终使用 UTF-8 进行编码。主机名当然是使用Punycode进行编码的。令人难以置信。
\n