2010-06-07 21 views
3

因此,我已經在此係統上構建了相當長的一段時間,並且它正在向Web瀏覽器輸出Latin1(ISO-8859-1),這是組件:更改MySQL中的字符編碼,PHP腳本,HTML

MySQL的 - 所有數據都存儲在latin1字符集

PHP - 所有PHP文本文件存儲在磁盤上以latin1編碼

HTML - 輸出有HTTP的當量=「內容類型「content =」text/html; charset = iso-8859-1「meta tag

因此,我試圖瞭解不同部分的編碼如何在我的工作流程中發揮作用。如果我打開一個PHP腳本並在文本編輯器中將其編碼更改爲UTF-8並將其保存回磁盤並重新加載Web瀏覽器,則文本全部混亂 - 除非文本來自數據庫。如果我將數據庫的編碼更改爲UTF-8並將PHP文件保存爲latin1,則必須使用utf8_decode()才能正確顯示數據。如果我更改HTML代碼,瀏覽器將錯誤地讀取它。

所以是的,我意識到如果我想「升級」到UTF8,我必須更新這個設置的所有三個部分才能正常工作,但是因爲它是一個包含大約180k行PHP代碼的龐大系統,數百萬個數據庫/表格中的帖子,我不想在沒有正確理解所有內容的情況下開始這樣的事情。

我還沒有想過什麼?除了修復之外,有什麼可能讓這個問題變得糟什麼是更改整個MySQL安裝的編碼的過程,以及更改磁盤上數百或數千個PHP文件的編碼的最簡單方法是什麼?

meta標記幸運的是動態添加,所以我會改變這種只在一個地方:)

讓我聽到這個您的經驗。

回答

2

這很棘手。

你必須:

  • 變化的DB和每個表的字符集/編碼 - 我不知道很多關於MySQL,但是看到here
  • 在PHP中設置客戶端編碼設置爲UTF-8 (SET NAMES UTF8)第一個查詢
  • 變化的meta標籤和可能的Content-type頭(注意Content-type頭具有優先權)
  • 所有PHP文件轉換爲UTF-8瓦特/ BOM之前 - 你可以用循環和iconv輕鬆做到這一點。
  • 最棘手的一切:你必須改變你的大部分字符串函數調用。不是指mb_strlen,而不是strlenmb_substr代替substr$str[index]
+0

數據庫 - 檢查,客戶端編碼 - 你的意思是當通過PHP與MySQL服務器連接時?元標記 - 檢查,PHP文件 - 檢查,PHP函數...呃,好的。雖然我不使用strlen和substr,那麼$ str [index]是什麼?你的意思是,當寫一個UTF8編碼的PHP文件時,我不能寫<? print $ foo [「Översrift」]?>假定字符串以UTF8數據的形式發送到PHP解釋器,並且保存的索引數據應該是相同的,不是? – Sandman 2010-06-07 11:06:28

+0

只要沒有來自別處的數據,$ foo [「Översrift」]將繼續工作,前提是所有文件都轉換爲utf-8。 – Wrikken 2010-06-07 16:07:32

+0

@Sandman是的,我的意思是當通過PHP與MySQL服務器連接時。我的意思是'$ str [index]'就像'$ str [0]'(索引是一個整數)。例如,你不能使用'$ str [0]'獲取第一個字符,因爲UTF-8是一個多字節編碼;如果第一個字符佔用超過1個字節(所有非ASCII字符都是這種情況),則$ str [0]將僅獲得該字符的第一個字節。還有其他許多情況 - 大部分對字符串進行操作的函數都必須進行修改。 – Artefacto 2010-06-07 23:31:16

-1

不要轉換爲UTF-8,如果你不就得了。它不值得麻煩。
UTF8是(成爲)新標準,因此對於我可以推薦的新項目。

函數
某些函數調用不再有效。對於處理latin1是:

echo htmlentities($string); 

對於UTF8是:

echo htmlentities($string, ENT_COMPAT, 'UTF-8'); 

的strlen(),SUBSTR(),等等不知道的多字節字符的。

MySQL的
mysql_set_charset('UTF8')mysql_query('SET NAMES UTF8')將轉換所有文字UTF8從數據庫(選擇)的到來。它還會將傳入的字符串(INSERT,UPDATE)從UTF8轉換爲表格的編碼。

因此,從latin1表中讀取時,不需要轉換表編碼。
但某些字符只能在unicode(如雪人iPhone,iPhone表情符號等)中使用,並且不能轉換爲latin1。 (這些數據將被截斷)

腳本
我試圖阻止特價字符在我的PHP腳本/模板。
我使用&euml;符號而不是ë等。這種方式是否保存在latin1或utf8中並不重要。

+1

只要你保存的內容在當前字符集中可用,MySQL表就不需要轉換。但是,如果不是這樣(當latin1 => utf8時這是不小的可能性),它們應該被轉換(ALTER TABLE foo SET CHARACTER SET utf8),如果它們已被單獨設置,它們可能會自行排列。 – Wrikken 2010-06-07 14:33:33

+0

不,如果您更改連接的編碼,mysql服務器/客戶端將會即時進行轉換。 – 2010-06-07 14:38:49

+0

我使用它,如果我需要生成一個ms-excel csv文件。表格是用UTF8編寫的,在'SET NAMES lantin1'之後,我可以寫入csv文件而不需要一個utf_decode() – 2010-06-07 14:42:01