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了。
問題解決啦。