1. 程式人生 > >cms開發中遇到的中文顯示亂碼問題

cms開發中遇到的中文顯示亂碼問題

這兩天在做cms開發時遇到中文顯示的亂碼問題,用了一個星期的時間,終於解決了,記下來。

我在資料庫端定義的編碼格式是UTF-8的,所以資料寫入資料庫時應該是UTF-8格式,但是我在客戶端看到的中文是亂碼,後來用mysql自己的客戶端登入後就是正常的中文了。但是前臺頁面顯示的亂碼問題還是沒解決,我又懷疑是jsp和html頁面的charset不是UTF-8的,我就把頁面的字符集顯式宣告成UTF-8的,但還是不成。 同事說可能是用outputstream寫模板檔案時沒用UTF-8寫,所以中文在html載入模板資料時是以亂碼的形式載入的。於是我又把cms裡讀資料庫資料的部分改成:

String zhStr = new String("讀到的字串".getBytes("UTF-8"),"UTF-8"),這樣可以保證從資料庫裡得到的中文是正確的。

寫模板的outputstream我改成:

Writer bout = new BufferedWriter(new OutputStreamWriter(new java.io.FileOutputStream(f),"UTF-8"));

java中的OutputStreamWriter可以在寫檔案時指定以何種編碼格式寫入資料。把OutputStreamWriter封裝在BufferedWriter中可以防止writer沒此寫入資料時頻繁呼叫編碼轉換器。

按說這樣應該解決問題了,可亂碼照舊。

後來我查到這個cms是用velocity寫html頁面的,當中有一個方法是得到已有資料的template,並將對應變數的資料寫入。

Velocity.getTemplate("/live/" + idInode + "." + VELOCITY_HTMLPAGE_EXTENSION).merge(context, out);

問題就在這裡,Velocity得到的template的內容編碼格式是ISO-8859-1的,所以在通過template寫html時編碼不是UTF-8,於是我將這句改成了:

Template template = new Template();

template = Velocity.getTemplate("/live/" + idInode + "." + VELOCITY_HTMLPAGE_EXTENSION,"UTF-8");

template.merge(context, out);

這樣template的編碼格式就是UTF-8了。

問題解決啦。