如何在表单上传输字符?

时间:2011-07-21 21:46:53

标签: php html forms unicode encoding

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

我一直在使用表单,并看到<meta charset="ISO-8859-7">标记对将在文本区域中键入的文本进行编码。事实上用于存储文件的编码方法不存在。

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

我假设表单是从编码的speciefied发送字节序列。 因为如果我输入一个字符,它将是一个编码将解释的字节。

例如<meta charset="ISO-8859-7"> 我输入一个字符"¥"

此char不是编码的一部分,但它必须作为它代表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 : 字符串永远不会被文件编码。可以工作和表示,但用于存储文件的编码与此无关。

4 个答案:

答案 0 :(得分:3)

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

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

HTML 5 指定不支持的字符应该在URL¹的查询部分中用ASCII ?替换(因此在GET表单中提交?),但我找不到任何POST表格。

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

当然,解决方案是一直使用UTF-8。然后编码支持所有字符,并且不会出现此问题。


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

  

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

有趣的事实:以上内容仅适用于IRI查询部分(问号后面的部分)。 路径部分始终使用UTF-8进行编码。主机名当然是使用Punycode编码的。心灵困惑。

答案 1 :(得分:1)

您是否尝试将charset绑定到form-element?

<form method="post" action="encode.php" accept-charset="ISO-8859-7">

例如。如果您使用utf-8,首先必须解码帖子:

$input=utf8_decode($_POST["input"]);

不太确定这是否涵盖了您的主题,但我希望它能以某种方式帮助:)

答案 2 :(得分:0)

charset引用更多地是关于浏览器接收(或接受其请求标头)的内容,而不是您在表单中输入内容的方式或方式。

我相信您键入的内容与HTML文档中的charset定义无关。重要的是键盘语言以及如何输入字符。如果您的键盘语言带有YEN符号,则您的浏览器将识别YEN符号并相应地执行转换为实体或字符引用。你想要一个YEN标志,你将获得YEN而不是希腊A5代表。

答案 3 :(得分:0)

这可能不是您特定问题的原因,但在使用字符编码问题时需要注意:使用相同的字符编码保存PHP脚本。否则可能会导致此类问题。