2009-10-20 23 views
6

大約2年前,我犯了一個使用iso-8859-1啓動大型網站的錯誤。我現在遇到了一些字符問題,尤其是使用ajax將數據發送到服務器時。正因爲如此,我想切換到使用UTF-8。更改網站從iso-8859-1到UTF-8的字符編碼

你看到了什麼問題?我知道我將不得不搜索該網站以查找需要更改的字符?他們的真實人物。但是,這樣做有沒有其他風險?有沒有人做過這個?

回答

7

的主要困難是確保你已經檢查所有數據路徑是UTF-8清潔:

  1. 您的網站是否DB-支持?如果是這樣,您需要將所有表格轉換爲UTF-8或其他Unicode編碼,以便排序和文本搜索正常工作。

  2. 您的網站是否使用一些編程語言進行動態內容? (PHP,mod_perl,ASP ...?)如果是這樣,您必須確保您使用的特定語言解釋程序完全理解某種形式的Unicode,如果它本身不使用UTF-8 — UTF-16是最常見的—,並檢查它是否配置爲在其輸出上使用UTF-8到Web服務器。

  3. 您的網站是否有某種後端應用程序服務器?它的文本輸出是否使用UTF-8?

  4. 至少有三個不同的地方可以聲明Web文檔的字符集。確保您更改它們都:

    • 的HTTP Content-Type
    • <meta http-equiv="Content-Type">標籤在你的文檔<head>
    • <?xml>標籤在文檔的頂部,如果用嚴格的XHTML

這一切都來自於幾年前我的經驗,當我通過一個比較複雜的N層應用程序追蹤一些Unicode數據,發現便利着想rsion連鎖店如:

Latin-1 → UTF-8 → Latin-1 → UTF-8 

所以,即使數據在瀏覽器中結束了自稱是「UTF-8」,該應用可能會仍然只處理與Latin-1的共同的子集。

這些奇怪的轉換鏈最大的原因是由於當時工具中不成熟的Unicode支持,但如果你不小心使管道UTF-8清潔,你仍然可以發現自己像這樣搞砸了。 。

至於你提到遍尋Latin-1字符,並逐一轉換文件的意見,我不會那樣做。我會在每個現代Linux系統上找到的iconv實用程序構建一個腳本,爲系統中的每個文本文件提供信息,並將其從Latin-1明確轉換爲UTF-8。不遺餘力。

+0

我們正在使用用PHP編寫的CMS來處理編碼。它運行在PostgreSQL上。在CMS中,我可以切換編碼,然後更改所有頁面中的內容類型標頭... – 2009-10-20 23:02:28

+0

我敢打賭,只是更改了CMS宣佈它用於mod_php的charset,它控制着Apache向瀏覽器。當然,我不希望它奇蹟般地遷移數據庫中的所有數據。它可能不會轉換CMS用於構建頁面的現有模板。底線:測試,測試,測試。將一些來自Latin-1集以外的字符放入數據庫中,並查看它們是否能在瀏覽器中生存。如果是這樣,然後檢查以確保您沒有任何多餘的轉換,如上所示。如果不是的話,東西仍然會將UTF-8粉碎成Latin-1。 – 2009-10-20 23:47:45

+0

想到另一個風險領域。將它添加到上面的編號列表中。 – 2009-10-20 23:56:03

2

這樣的改變觸及(幾乎)系統的每個部分。你需要經歷一切,從數據庫到PHP到HTML到網頁瀏覽器。

啓動一個測試網站並對其進行一些嚴肅的測試(在各種平臺上執行各種事情的各種瀏覽器)。

IMO真正熟悉UTF-8以及它對於軟件意味着什麼非常重要。幾個快速點:

  • PHP是基本上面向字節的。瞭解字符,代碼點和字節之間以及UTF-8和Unicode之間的區別。
  • UTF-8設計良好。例如,給定兩個UTF-8字符串,一個面向字節的strstr()仍然可以正常工作。
  • 最常見的問題是將UTF-8字符串視爲ISO-8859-1,反之亦然 - 您可能需要向函數添加文檔,說明它們期望的編碼類型,從而減少這類錯誤的發生。字符串的變量命名約定(用於指示他們使用的編碼)也可能有所幫助。