我們在寫程式的時候,很長遇到的一個問題就是當我們從某個外部資源(可能是文字檔案,可能是DB等)讀取文字顯示出來的時候,中文變成亂碼。 或者是輸入的文字,讀進來變成亂碼。
基本上為什麼會是亂碼大家都有個基本概念,那就是encoding錯誤了,但是當我們遇到亂碼的時候,有時候很難一步一步去排除那邊有問題。
今天我在網路上看到了一篇對於排除亂碼問題寫的滿詳細的,看過以後對於解決亂碼的步奏會有一個更清晰的瞭解。
前言
我們在寫程式的時候,很長遇到的一個問題就是當我們從某個外部資源(可能是文字檔案,可能是DB等)讀取文字顯示出來的時候,中文變成亂碼。 或者是輸入的文字,讀進來變成亂碼。
基本上為什麼會是亂碼大家都有個基本概念,那就是encoding錯誤了,但是當我們遇到亂碼的時候,有時候很難一步一步去排除那邊有問題。
今天我在網路上看到了一篇對於排除亂碼問題寫的滿詳細的,看過以後對於解決亂碼的步奏會有一個更清晰的瞭解。
中文化和國際化問題權威解析之三:Java中文問題分析 - 老唐 的專欄 - 博客頻道 - CSDN.NET
一些補充
那篇文章寫的滿詳細的,我找到這一篇的原因其實是因為我遇到輸出變成1個問號的問題,結果參考那篇才注意到是content type和charset沒有設定的原因。
不過在看那一篇文章的時候,我有注意到兩個可以補充的地方:
- 使用javac編譯的時候傳入的-encoding參數
- Tomcat URIEncoding
使用javac編譯的時候傳入的-encoding參數
在文章裡面提到過javac 有一個參數是-encoding,表示這個.java檔案是用什麼編碼寫成的,使用正確的encoding才不會導致.java裡面有中文字編譯出錯。
但是我們真的做專案的時候通常都會使用IDE,而比較少透過javac來編譯,那麼其實就需要注意到個別IDE是如何設定encoding,這邊以eclipse做例子:
我們在Preference 裡面搜索 encoding ->找到「workspace」->把「Text Encoding」改成 utf-8:
我就遇到過因為這邊沒有設定結果Tomcat完全啟動不起來,然後給出很奇怪的錯誤訊息,類似關於什麼literal有出錯。
Tomcat Server.xml Connector URIEncoding="utf-8"
有時候在form post回來的數值,讀取出來可能會變成亂碼,這個時候就需要注意Tomcat裡面connector的編碼。
這邊需要設定:
在Tomcat裡面的server.xml,找到對應的connector,然後加上 URIEncoding="utf-8":
我之前遇到問題是只需要改URIEncoding為UTF8就可以,不過另外一篇有更詳細內容,可以參考:
Encoding Gossip: Servlet 中文處理(Tomcat)
結語
亂碼問題其實很容易會遇到,尤其是寫Java EE的時候。因此有一個比較清楚的概念要解決起來會容易很多。
這邊介紹雖然是以Java為主,不過其實亂碼的概念對於任何語言來說都通用。