<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) "¥"
注意:我已经测试过更改用于存储文件的编码。
index.php 中的:
无论使用哪种编码来存储文件,如果未指定accept-charset=""
,表单始终会使用<meta charset="">
属性或accept-charset=""
标记进行发送。
使用 encode.php : 字符串永远不会被文件编码。可以工作和表示,但用于存储文件的编码与此无关。
答案 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脚本。否则可能会导致此类问题。