2024年4月24日 星期三

[編碼]Java Web的編碼問題

 一陣子沒有寫中文的部落格文章了,不過,這篇主要是放在中文編碼上,所以還是寫了一篇許久未寫的中文文章,來回饋一下。先講一下我遇到的情況,主要是把一個舊專案的Big 5編碼轉成UTF-8,這中間還需要處理,難字、弱掃的問題。基本上UTF-8應該已經算是web的標準編碼了,不過,在專案公司上班,後端工程師,總是會遇到一些歷史包袱不輕的案子。

再大概講一下基本觀念,基本上,Java的字串是UTF-16,所以各字串轉到Java處理時,都會進行編碼,而轉出時也會再次進行編碼,而難字的部分是預留空間可以使用的自訂義編碼,MS950(for 微軟)和CP950(for Linux)都是Big5的擴充字集了,不過這幾個擴充的字集大小我不太確定那個比較多,不過,可以確定的是UTF-8是提供比Big5更多的字集,不過,當遇到不支援的文字時,都是需要另建字檔,每台電腦上需要安裝這個字檔,不過,這塊有專門的廠商在做了,也只是最常用的解決方案之一就是了。

http://smallken.com/blog/wp-content/uploads/2010/06/Untitleddrawing2.png

AP Server上到底有幾個地方要設定呢?其實我試過很多地方的設定,但,我最後確定的是主要有幾個,第一個是URL Encoding, 第二個是Filter,第三個是File Encoding,第四個是JSP的開頭的部分,不過1, 3JBoss有不一同的設定方式,可以參考下面 JEAP 5&6 — 編碼設定問題 (Encoding) 、使用 CharacterEncodingFilter 解決 Java Web 的編碼問題 這二篇。不過,第三個我是沒設就是了,其它三個是一定要設定就是了。其它有的沒的設定可以拿掉看看,至於信良哥的編碼文章,因為我也沒有特別去試,我覺得還是先試這四個設定都不行了,再去看那些細部設定就好了。

最後簡單說一下遇到的坑吧: 1. url的部分中文傳到後端還是會變亂碼,我是使用encodeURIComponent這個js function來解決這個問題,不知道為何傳到後端會幫你自動解成正確的中文QQ。2. JSP檔案的編碼需要是UTF-8,其實原本檔案是Big5,但在我local是可以正常運行的,放到server就是亂碼,不過因為檔案有點多,我是用mac的iconv來轉,如果使用windows的朋友,可以用uniconv(沒用過,不掛保證XD)。3. ESAPI也需要設定編碼,如果弱掃需要使用這個資安的套件,主要在ESAPI.properties可以設定編碼Encryptor.CharacterEncoding=UTF-8和HttpUtilities.ResponseContentType=text/html; charset=UTF-8。

參考資料:

你的原始碼是什麼編碼?

UniConv - 超強轉碼工具 BIG5/GB/UTF8/Unicode

http://www.importnew.com/19791.html

JavaScript 的 encodeURIComponent() 會將字串轉換成 UTF-8 編碼 - Tsung's Blog

Big5、UTF-8、難字、外字解決方案選擇

JEAP 5&6 - 編碼設定問題 (Encoding)

使用 CharacterEncodingFilter 解決 Java Web 的編碼問題

亂碼 1/2