2010-07-13 79 views
4

所以,我遇到了PHP的rawurlencode函數的問題。我們的網絡應用程序中的所有文本字段在被網絡服務器處理之前當然會被轉換,並且我們已經使用了rawurlencode。對於我找到的幾乎每個角色都適用,期望獲得「£」符號。現在,我們的用戶沒有理由永遠輸入英鎊符號,但他們可能會這麼做,所以我想要照顧好這一點。(PHP)rawurlencode/decode似乎將'£'標記編碼爲''(%C2%A3而不是%A3)

問題是rawurlencode不會將網頁上輸入的英鎊符號編碼爲%A3,而是將其編碼爲%C2%A3。更糟糕的是,如果用戶未能輸入另一個關鍵信息(這會導致網頁刷新 - 檢查在後端完成 - 並嘗試使用用戶使用的信息重新填充表單框),那麼當%C2通過rawurldecode/encode運行,它變成了? - 又名%C3 ?.當然這個「£」也會變成另一個!

那麼,這是什麼原因造成的?我認爲這是一個字符編碼問題,但我不知道這些事情。我聽說某處我可以手動編碼爲&磅,但爲什麼我需要在數據庫可以處理「英鎊」時做這件事,並且英鎊符號有百分比編碼?這是rawurlencode中的錯誤,還是由不同字符集造成的錯誤?

感謝您的任何幫助。

回答

3

如果未指定或用戶輸入的文本無法在您指定的字符集中表示,則標準要求以您在<form accept-charset="...">或UTF-8中指定的字符編碼提交表單。

顯然,您正在接收以UTF-8編碼的井號。如果你想將其轉換爲ISO-8859-15,寫:

iconv("UTF-8", "ISO-8859-15//TRANSLIT", $original) 
+0

因此,哪種方法更好 - 更改表單的字符集 - 請注意,我在w3schools上找到的屬性是accept-charset,而不是字符集 - 或者在代碼中使用iconv?我讀到IE顯然不能正確使用accept-charset,那麼將服務器端轉換爲UTF更好嗎? – Stephen 2010-07-13 13:30:55

+0

@Stephen你說得對,它是「接受字符集」。我認爲最好在服務器端做,因爲標準並不能保證你不會得到UTF-8。更好的是,始終使用UTF-8,包括將數據存儲在數據庫中。國際海事組織,所有新的Web應用程序都應朝着這個方向前進。 – Artefacto 2010-07-13 15:43:50

+0

@Stephen請注意,儘管這是標準,但仍有一些實現問題,特別是一些瀏覽器使用頁面編碼來確定提交的編碼,儘管存在「accept-charset」。請參閱http://stackoverflow.com/questions/153527 – Artefacto 2010-07-13 15:53:08

2

這可能是編碼A3字符在您的本地字符集中設置爲C2A3的UTF-8編碼,這似乎是ANSI A3的有效UTF-8編碼。只需使用UTF-8編碼 來使用您的編碼url,或者指定一個ANSI編碼爲urlencode。

Artefacto的回答表示您需要轉換字符編碼的情況,例如,您正在顯示頁面並且頁面編碼設置爲Latin-1。 (Raw)Urlencode將產生具有多字節字符表示的轉義字符串。 (原始)Urldecode將默認生成utf-8編碼的字符串,並將表示爲兩個字節。如果顯示該字符串聲明它是ISO-8859編碼的字符串,則它將顯示爲兩個字符。

php和UTF-8底漆:http://www.phpwact.org/php/i18n/utf-8
一些「熱點提示」:http://www.sitepoint.com/blogs/2006/08/10/hot-php-utf-8-tips/

有可能的,正從rawurldecode字符串,並使用字符串之間,該區域被假定爲ISO8859,所以當兩個字節表示一個字節時,它們被解釋爲兩個字符。

使用mb_convert_encoding強制PHP意識到字符串中的字節表示UTF-8編碼的字符串。

+1

有沒有辦法告訴PHP的進行urlencode(或更好,rawurlencode,因爲用urlencode是過時)使用不同的不同ANSI編碼?我沒有看到任何功能的手冊頁上的方式。 – Stephen 2010-07-13 13:31:41

相關問題