2011-07-21 75 views
5
<head> 
<meta charset="ISO-8859-7"> 
</head> 

我一直在使用表单,并看到<meta charset="ISO-8859-7">标记对将在文本区域内输入的文本进行编码。这是用来存储文件的编码方法不是。字符如何通过表单传输?

我已经看到了,如果键入的字符不是由<meta charset="ISO-8859-7">标签speciefied编码的一部分,该角色会是referenced(& #D;)

我假设的形式发送的字节来自编码规范的序列。 因为如果我键入一个字符无论它是什么,将是一个编码将解释的字节。

例如与<meta charset="ISO-8859-7"> i的一个形式的字符"¥"

这炭类型不是编码的一部分,但它必须发送作为它代表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: 该字符串从不编码的文件。可以工作和表示,但用于存储文件的编码与此无关。

+1

为什么不使用UTF-8? – CuriousMind

+0

我使用UTF-8,但我想知道这个问题。 – nEAnnam

+0

'Content-Type'头部是否可以发送冲突字符集? – cmbuckley

回答

3

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

据我所见,如果用户在form编码不支持的表单字段中输入字符,HTML 4和HTML 5都不能指定浏览器应该做什么。

HTML 5 指定不支持的字符应由URLs¹的查询部分的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问号)替换它。 ..]

有趣的事实:以上仅适用于的查询部分(问号后面的部分) 10。 路径部分是总是使用UTF-8编码。主机名当然使用Punycode进行编码。头脑非常混乱。

+0

所以没有办法让窗体接受一个非编码字符的一部分? – nEAnnam

+0

关于HTML5指定不支持的字符应该被替换...它可能与POST方法相同,可以参考该信息吗? – nEAnnam

+0

1)好点,我添加了一个参考。 2)没有明确的方式让表单接受表单编码不支持的字符。 (表单编码可以在

标签上明确给出或者从文档编码中派生出来。) –

1

您是否尝试过将字符集绑定到form-element?

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

例如,如果您使用UTF-8,你首先要后解码:

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

不太清楚,如果这涉及您的主题,但我希望它有助于在某种程度上:)

+0

谢谢,但仍然与上面相同,重点是表单不会作为字节发送,即使我使用'utf8_decode()'函数,也没有任何解码。而关于'accept-charset =“ISO-8859-7”'仍然是同样的问题。 – nEAnnam

0

的字符集的引用更多的是关于什么浏览器接收(或接受他的请求标题),而不是你在表单中输入什么或如何输入内容。

我相信你输入的内容与HTML文档中的字符集定义不相关。重要的是你键盘语言和你如何输入字符。如果您的键盘语言带有YEN标志,则您的浏览器将识别YEN标志并相应地将该翻译转换为实体或字符引用。你想要一个YEN的牌子,你会得到一个YEN而不是希腊的A5代表。

0

这可能不是您的特定问题的原因,但在编码字符编码时应注意以下几点:使用相同的字符编码保存您的PHP脚本。否则很容易造成这种问题。

+0

是的,它主要是我做的,但我对这个问题非常认真。谢谢你。 – nEAnnam

相关问题