如何在表单上传输字符?

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) "&#165;"
Run Code Online (Sandbox Code Playgroud)

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

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

并使用encode.php:该字符串永远不会被文件编码.可以工作和表示,但用于存储文件的编码与此无关.

Sør*_*org 3

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

\n\n

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

\n\n

HTML 5确实指定在 URLs\xc2\xb9 的查询部分中应将不支持的字符替换为 ASCII ?(因此在 GET 表单提交中?),但我找不到 POST 表单的任何内容。

\n\n

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

\n\n

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

\n\n
\n\n

\xc2\xb9 2.6.3 解析 URL。HTML 5,W3C 工作草案,2011 年 5 月 25 日,第 8.1 项:

\n\n
\n

如果有问题的字符无法用编码编码表示,则将其替换为单个 0x3F 八位字节(ASCII 问号)[...]

\n
\n\n

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

\n