編碼問題的確非常的棘手。很多時候,你一不小心,在某個階段沒有正確的轉碼,結果造成儲存下來的檔案 或者 儲存進入資料庫的欄位是亂碼。如果這個欄位是非常重要的資訊,你可能認為,你已經無法恢復這些資訊了,其實,在大多數情況下面這個是能夠恢復的,你要分析你轉碼的每個過程,確定出差錯的位置,然後進行這個編碼的逆轉。 這裡我只舉一個我實際中遇到的一個例子。這個例子的情況是這樣的,我在cookie裡面儲存了一個username欄位,寫cookie是透過PHP程式寫的,這個PHP程式的編碼是gbk的。另外一個統計系統,這個統計系統,透過Javascript 讀取cookie資訊,然後透過url編碼這些資訊,傳送到伺服器端。這個統計的伺服器的編碼是utf-8的。 首先你要分析整個過程:1. PHP寫cookie,不會進行轉換編碼,但是會對字元進行urlencode。2. Javascript 讀取cookie的內容,進行urldecode,儲存進入一個字串3. 呼叫Javascript urlencode函式,這個函式有問題,他預設認為Javascript 的 編碼是本地Unicode的。 並轉換成utf-8 。順便提一句,比如你的頁面是gbk的,但是 a = "變數值" a內部儲存是Unicode的,不再是gbk。瀏覽器會進行編碼轉換。 4. 伺服器端把這個字串轉碼,然後儲存進入資料庫。 可以發現,實際上出錯的地方就是Javascript 認為cookie讀到的字串是本地Unicode的。而實際上是一個gbk編碼的字串。 這樣只要倒過來就可以了:讀出資料庫字串的內容,把utf-8的程式碼轉成Unicode,這個轉過後的Unicode 就是原來的 gbk編碼的序列。 下面附上一段原始碼。為了檢視字串內部位元組的排列,我把序列都用urlencode過。 程式碼關於utf8 和 Unicode 序列轉換規則 你可以google。PHP裡面不支援本地Unicode。也沒有提供相關的函式。
編碼問題的確非常的棘手。很多時候,你一不小心,在某個階段沒有正確的轉碼,結果造成儲存下來的檔案 或者 儲存進入資料庫的欄位是亂碼。如果這個欄位是非常重要的資訊,你可能認為,你已經無法恢復這些資訊了,其實,在大多數情況下面這個是能夠恢復的,你要分析你轉碼的每個過程,確定出差錯的位置,然後進行這個編碼的逆轉。 這裡我只舉一個我實際中遇到的一個例子。這個例子的情況是這樣的,我在cookie裡面儲存了一個username欄位,寫cookie是透過PHP程式寫的,這個PHP程式的編碼是gbk的。另外一個統計系統,這個統計系統,透過Javascript 讀取cookie資訊,然後透過url編碼這些資訊,傳送到伺服器端。這個統計的伺服器的編碼是utf-8的。 首先你要分析整個過程:1. PHP寫cookie,不會進行轉換編碼,但是會對字元進行urlencode。2. Javascript 讀取cookie的內容,進行urldecode,儲存進入一個字串3. 呼叫Javascript urlencode函式,這個函式有問題,他預設認為Javascript 的 編碼是本地Unicode的。 並轉換成utf-8 。順便提一句,比如你的頁面是gbk的,但是 a = "變數值" a內部儲存是Unicode的,不再是gbk。瀏覽器會進行編碼轉換。 4. 伺服器端把這個字串轉碼,然後儲存進入資料庫。 可以發現,實際上出錯的地方就是Javascript 認為cookie讀到的字串是本地Unicode的。而實際上是一個gbk編碼的字串。 這樣只要倒過來就可以了:讀出資料庫字串的內容,把utf-8的程式碼轉成Unicode,這個轉過後的Unicode 就是原來的 gbk編碼的序列。 下面附上一段原始碼。為了檢視字串內部位元組的排列,我把序列都用urlencode過。 程式碼關於utf8 和 Unicode 序列轉換規則 你可以google。PHP裡面不支援本地Unicode。也沒有提供相關的函式。