我們知道在學習php和jsp的時候,出現亂碼是經常性的事情,怎樣來一勞永逸的解決這個問題,我來做個總結。
首先來了解一下字符集,我們關心的字符集大概有這么幾個,iso-8859-1、gb2312、gbk、utf-8,其中iso-8859-1是采用1個字節進行編碼,而gb2312和gbk則是在其基礎之上使用雙字節來對漢字進行編碼,而utf-8使用了3個字節編碼(實際上是變字節編碼,一般2-4個字節),因此它容納了幾乎所有字符,包括中國、日本和韓國的表意字符。這也就不難理解為什么字符集設置錯誤會導致亂碼了。
在來看一下在編程的過程中有哪些地方涉及到字符集的設置,本質上只有兩個地方,文件本身的字符集和瀏覽器解析時使用的字符集,當然數據庫也存在字符集的設置(其實數據庫本質和文件沒有區別),那怎樣才能避免亂碼呢?我們要保證字符集的一致性,那就是數據庫、文件、瀏覽器3者使用的字符集是一致的,要么都是gb2312,要么都是utf-8,當然iso-8859-1不行,它不支持中文。
數據庫在建庫和建表時可以設置字符集,文件在保存的時候可以選擇字符集,那么瀏覽器的字符集怎么設置呢,首先瀏覽器由一個默認字符集,在中文操作系統下一般默認為gb2312,如果不進行設置,它就是解析文件的字符集;那應該怎么設置呢,有兩種方法,一種在html中設置,即使用meta標簽,在meta標簽里面制定Content-type就可以了,meta標簽是用來模擬http頭信息的,另外一種就是在編程語言進行設置,我們可以向http header里面添加一個Content-type來指定字符集,如php里面的header()結構.
可是萬一我們不能控制數據庫或某些文件的編碼了,那應該怎么處理呢,例如你現在所有的項目都是采用的utf-8(建議都這樣使用),可是數據庫里面的數據卻是gb2312,或者某個遠程文件是使用gb2312編碼,這些是你無法修改的,我們只有在程序中進行修改,如在php里面提供了iconv函數和mb系列函數進行字符的編碼修改。
總之,一句話,讓項目的所有地方保持編碼一致性,無法控制的部分用字符集轉化函數來改變它。
posted on 2008-08-25 22:59
我是風之子 閱讀(2501)
評論(2) 編輯 收藏 所屬分類:
服務器相關