2011-07-21 76 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

相關問題