2009-09-19 54 views

回答

15

簡而言之:您並不真正瞭解通過GET或POST傳遞給PHP腳本的變量上使用的編碼(字符集)(特別是GET在這裏是一個問題)。按照慣例,瀏覽器POST使用可通過http-equiv -meta標記(HTML5中的charset -meta標記)指定的頁面編碼或通過HTTP標題形式到action-屬性中指定的服務器端資源。或者,某些瀏覽器在選擇正確的編碼時也會尊重表單上的屬性accept-charset

GET參數和URL本身的編碼取決於瀏覽器的界面,因此可以由用戶控制。你不應該依賴特定的編碼。

通常你會通過始終使用UTF-8的一切,並通過指定的HTTP報頭中的正確的編碼(Content-Type: text/html; charset=UTF-8)環遊最編碼相關的問題 - 這將在所有產生正確的編碼(UTF-8)傳遞到你的字符串中的變量(我們不是在談論那些故意試圖混淆編碼以允許一些攻擊向量進入腳本的rouge腳本)。你也不應該依賴你的GET參數或URL中的非ASCII字符(這也是爲什麼搜索引擎友好鏈接刪除這些字符或替代它們的原因)。

如果確保UTF-8是唯一允許的字符集,則可以使用mb_strlen($string, 'UTF-8')來檢查變量的長度。

編輯:(增加了一些鏈接)

有些東西給你看:

+0

URL的編碼也取決於引用文檔。只有直接在地址欄中輸入URL,瀏覽器的設置纔是關鍵。 – Gumbo 2009-09-19 13:07:21

5

使用mb_internal_encoding知道當前設置了哪種編碼。如果您的應用程序使用不同編碼的日誌,最好使用mb_strlen。

乾杯

1

通常你的字符編碼的控制,因爲您從您發送給客戶端的HTML $ _REQUEST。

ie:它是由您從PHP發送的頁面生成的。

因此,您不應該檢測編碼。

使用mb_functions需要啓用多字節擴展 - 所以如果你要分發代碼,你必須意識到不是每個人都會擁有它。

header('Content-Type: text/html; charset=UTF-8'); 

或HTML:

<meta charset="utf-8"> 

http://www.w3.org/International/O-charset

編輯:PHP6有UTF-8的支持,而不是PHP5。

+0

「字符串函數是UTF-8兼容」 。是不是意味着在php5中strlen會返回正確長度的utf8字符串? – lovespring 2009-09-19 06:14:34

+0

「從PHP5開始,字符串函數與UTF-8兼容。」這肯定是不正確的。 PHP的內部字符串函數都在字節級別上運行,這意味着它們無法處理多字節字符(對PHP <6有效)。在使用這些字符集時,字符長度(以字節爲單位)對其操作非常重要的所有內部函數都容易出錯。提到的多字節擴展(mb_ *)具有超載能力,但我強烈建議不要使用它。 – 2009-09-19 12:30:48

+0

我在那裏,PHP5沒有任何多字節支持。 – bucabay 2009-09-19 16:11:09