如果在Windows系統下使用eclipse開發Java應用,那么開始的時候我們一般不會考慮編碼問題,但是隨着不斷學習,接觸到前端、服務端、數據接口、數據庫等更多的組件時,編碼問題就逐漸暴露出來了,我們會在程序內部對編碼進行轉換,但是好像有時候好用有時候不好用,下面就具體解決一下這個問題
事實上所有的開發環境都是運行在操作系統上的,所以操作系統使用的默認字符集和我們開發的編碼問題都有着很大的關系,但是一般是由於軟件設置的問題,我們一般不會考慮操作系統的影響,大部分時候通過上層設置是可以覆蓋的,但是我們必須知道操作系統作為最底層決定了應用軟件的運行狀態
編碼的設置是有優先級的,這個應該不難發現,離應用程序越近的組件影響越大,在我們開發過程中大致優先級由低到高的順序應該是:
操作系統默認字符集->項目環境字符集->服務器設置字符集->文件本身指定或者使用的字符集
就好比數據庫一樣:數據庫系統的字符集->數據庫字符集->數據表字符集->每一個字段的字符集這樣的關系
當優先級高的字符集沒有設置時,默認會使用優先級較低的字符集,無論如何操作系統總會有一個默認的字符集,當其他字符集都沒設置時,那么就會使用操作系統默認的字符集,所以開發項目的時候務必要設置除操作系統之上的每一層的字符集保持一致,為了通用性推薦使用utf-8編碼
在Windows系統上開發常見的一個問題就是編碼問題,而Linux上這個問題卻不常見,因為Windows簡體中文操作系統默認編碼是GBK編碼或者ANSI的字符集,ANSI字符集則是隨不同版本的操作系統而變化,並且不同ANSI之間也是不能通用的,就連記事本另存為utf-8編碼的時候也摻雜着BOM頭,所以使用Windows操作系統開發時會出現各種問題,Linux一般采用的是Unicode通用的字符集,所以通用性較好,一般不會出問題
幸好,我們沒必要擔心操作系統的編碼問題,所有的開發項目中,我們都讓應用編碼覆蓋操作系統的編碼,這樣的話,能在應用程序的層面保證編碼的正確性,亂碼問題也就解決了,下面大體看一下eclipse的編碼設置:
在Windows上運行eclipse默認的項目編碼是Windows操作系統的編碼也就是GBK編碼,文件編碼比如xml和jsp編碼默認是ISO-8859-1,西歐字符集只支持英文輸入,當我們保存中文時也會提示我們是不是要保存為UTF-8,點擊確定后也會保存成utf-8,下面我們自己來設置項目和文件的編碼
首先,單擊菜單欄"Window"選擇"Preferences"
然后在左側選擇General->Workspace,右側會看到Text file encoding選項,這里默認是Default:GBK編碼,我們選中Other 選擇UTF-8編碼
然后,單擊"OK"按鈕,完成設置,現在我們就設置好了工作空間的編碼,就是我們以后的開發環境下所有文件,如果沒有指定,那么都將統一是utf-8編碼的,這就是符合上面的優先級的原則
當然我們還可以對項目,目錄,單個文件的編碼進行設置,比如我們在項目管理器中對需要設置的對象上面右擊,選擇"Properties"
然后左側默認是Resource,右側我們看到Text file encoding下面選中的是Inherited from container (UTF-8),意思是默認繼承自容器編碼,因為上一步我們設置工作空間為UTF-8編碼,所以這里如果我們不指定編碼那么將會繼承容器編碼
好的,那么同理我們可以根據優先級的原則,指定目錄編碼,包編碼,每一個文件編碼,當然推薦全部繼承於工作空間編碼,並設置為utf-8的編碼,這樣所有的文件保存在硬盤上都是純utf-8編碼,這樣就設置好了java web的字符集
通常我們在開發中,指定工作空間編碼和所有文件編碼都統一后,數據庫,數據表,連接數據庫的指定編碼都要全部保持統一,個別需要轉換的地方單獨轉換即可,另外頁面聲明的編碼也要全部統一,這樣的話瀏覽器能應用程序都可以正確的識別並解析,
服務器編碼一般我們都會注釋掉,就是說全部以文件本身傳遞的編碼為默認編碼,比如Nginx、Apache一般都是注釋的當然如果要設置也必須設置為統一的,這樣服務器才能正常運行應用程序
最后是程序運行的編碼,這個一般也是注釋的,比如java是服務器交給jre環境去運行,php是服務器交給php模塊去執行,那么這些編碼如果設置也必須在配置文件中統一,另外對於java編譯的過程,eclipse會根據項目設置編碼去編譯,但是如果使用cmd命令編譯的話會出現無法映射的情況,這就是命令行默認使用操作系統編碼GBK來進行編譯,所以會報錯,這個時候我們執行編譯的命令時應該給編譯器指定編碼:
比如:javac -encoding UTF-8 xxx.java這樣編譯問題就解決了
最后,我們只要對項目整體每個層次的字符集保持一致,都弄清楚,從本質上分析問題,那么編碼問題就可以徹底解決了