[java] 中文亂碼處理步奏

我們在寫程式的時候,很長遇到的一個問題就是當我們從某個外部資源(可能是文字檔案,可能是DB等)讀取文字顯示出來的時候,中文變成亂碼。 或者是輸入的文字,讀進來變成亂碼。

基本上為什麼會是亂碼大家都有個基本概念,那就是encoding錯誤了,但是當我們遇到亂碼的時候,有時候很難一步一步去排除那邊有問題。

今天我在網路上看到了一篇對於排除亂碼問題寫的滿詳細的,看過以後對於解決亂碼的步奏會有一個更清晰的瞭解。

前言

我們在寫程式的時候,很長遇到的一個問題就是當我們從某個外部資源(可能是文字檔案,可能是DB等)讀取文字顯示出來的時候,中文變成亂碼。 或者是輸入的文字,讀進來變成亂碼。

基本上為什麼會是亂碼大家都有個基本概念,那就是encoding錯誤了,但是當我們遇到亂碼的時候,有時候很難一步一步去排除那邊有問題。

今天我在網路上看到了一篇對於排除亂碼問題寫的滿詳細的,看過以後對於解決亂碼的步奏會有一個更清晰的瞭解。

中文化和國際化問題權威解析之三:Java中文問題分析 - 老唐 的專欄 - 博客頻道 - CSDN.NET

一些補充

那篇文章寫的滿詳細的,我找到這一篇的原因其實是因為我遇到輸出變成1個問號的問題,結果參考那篇才注意到是content type和charset沒有設定的原因。

不過在看那一篇文章的時候,我有注意到兩個可以補充的地方:

  1. 使用javac編譯的時候傳入的-encoding參數
  2. Tomcat URIEncoding

使用javac編譯的時候傳入的-encoding參數

在文章裡面提到過javac 有一個參數是-encoding,表示這個.java檔案是用什麼編碼寫成的,使用正確的encoding才不會導致.java裡面有中文字編譯出錯。

但是我們真的做專案的時候通常都會使用IDE,而比較少透過javac來編譯,那麼其實就需要注意到個別IDE是如何設定encoding,這邊以eclipse做例子:

我們在Preference 裡面搜索 encoding ->找到「workspace」->把「Text Encoding」改成 utf-8:

eclipse設定workspace encoding

我就遇到過因為這邊沒有設定結果Tomcat完全啟動不起來,然後給出很奇怪的錯誤訊息,類似關於什麼literal有出錯。

Tomcat Server.xml Connector URIEncoding="utf-8"

有時候在form post回來的數值,讀取出來可能會變成亂碼,這個時候就需要注意Tomcat裡面connector的編碼。

這邊需要設定:

在Tomcat裡面的server.xml,找到對應的connector,然後加上 URIEncoding="utf-8":

Tomcat connector encoding

我之前遇到問題是只需要改URIEncoding為UTF8就可以,不過另外一篇有更詳細內容,可以參考:

Encoding Gossip: Servlet 中文處理(Tomcat)

結語

亂碼問題其實很容易會遇到,尤其是寫Java EE的時候。因此有一個比較清楚的概念要解決起來會容易很多。

這邊介紹雖然是以Java為主,不過其實亂碼的概念對於任何語言來說都通用。 

點部落 的標籤:

Google+

創用 CC 授權條款
Alan Tsai 的隨手筆記Alan Tsai製作,以創用CC 姓名標示 4.0 國際 授權條款釋出。