簡體   English   中英

PHP中UTF-8編碼的問題

[英]problems with UTF-8 encoding in PHP

我從URL獲得的字符(例如www.mydomain.com/?name=john)很好,只要它們不是俄語即可。

如果他們是俄語,那我就說' '。

因此,我添加了$ name = iconv(“ cp1251”,“ utf-8”,$ name); 現在,它可以很好地用於俄語和英語字符,但會破壞其他語言。 :)))

例如,在iconv之前運行良好的“Jānis”(拉脫維亞語)現在變成了“jДЃnis”。

是否知道是否有一些通用編碼器可同時適用於西里爾語言和其他語言?

為什么不只對所有文件和進程使用UTF-8?

實際上,這歸結為URL編碼方式的問題。 如果您單擊給定頁面上的鏈接,瀏覽器將使用該頁面的編碼發送請求,但是如果您直接將URL輸入到瀏覽器的地址欄中,則行為將以某種方式未定義,因為使用的編碼(Firefox提供了about:config開關以使用UTF-8編碼的URL)。

除了使用某種編碼檢測外,還無法知道給定請求中與URL一起使用的編碼。

編輯:

為了備份上面所說的內容,我編寫了一個小測試腳本,該腳本顯示了五個主要瀏覽器的默認行為(在我的情況下運行Mac OS X-在IE情況下通過Parallels運行Windows Vista):

$p = $_GET['p'];
for ($i = 0; $i < strlen($p); $i++) {
    // this displays the binary data received via the URL in hex format
    echo dechex(ord($p[$i])) . ' ';
}

調用http://path/to/script.php?p=äöü會導致

  • Safari(4.0.5): c3 a4 c3 b6 c3 bc
  • Firefox(3.6.3): c3 a4 c3 b6 c3 bc
  • 谷歌瀏覽器(5.0.375.38): c3 a4 c3 b6 c3 bc
  • Opera(10.10): e4 f6 fc
  • Internet Explorer(8.0.6001.18904): e4 f6 fc

因此很明顯,前三個使用UTF-8編碼的URL,而Opera和IE使用ISO-8859-1或其某些變體。 結論 :您不能確定通過URL發送的文本數據的編碼是什么。

似乎問題出在文件編碼,您應該始終使用UTF-8 no BOM作為.php文件的首選編碼,諸如Intype之類的代碼編輯器讓您輕松指定此編碼(UTF-8 Plain)。

替代文字

另外,在任何輸出之前,將以下代碼添加到文件中:

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

您還應該閱讀Joel Spolsky撰寫的《絕對最低,絕對是每個軟件開發人員絕對,肯定必須知道的Unicode和字符集》(無借口!)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM