指定统一字符集时,到底是指定ISO8859_1 、GBK还是UTF-8呢?
: r) b. w @3 p+ | (1)如统一指定为ISO8859_1,因为目前大多数软件都是西方人编制的,他们默认的字符集就是ISO8859_1,包括操作系统Linux和数据库MySQL等。这样,如果指定Jive统一编码为ISO8859_1,那么就有下面3个环节必须把握:
+ I/ x3 J8 d( e: @* H 开发和编译代码时指定字符集为ISO8859_1。
; Y0 M, D5 Q& L& v, |% R, h 运行操作系统的默认编码必须是ISO8859_1,如Linux。- k) O- F0 R0 g# z
在JSP头部声明:。+ ~8 I8 v( n0 V$ H) ~
(2)如果统一指定为GBK中文字符集,上述3个环节同样需要做到,不同的是只能运行在默认编码为GBK的操作系统,如中文Windows。% Y8 I' I6 i6 J/ q4 O, c" r
统一编码为ISO8859_1和GBK虽然带来编制代码的方便,但是各自只能在相应的操作系统上运行。但是也破坏了Java跨平台运行的优越性,只在一定范围内行得通。例如,为了使得GBK编码在linux上运行,设置Linux编码为GBK。
/ U( s# }1 o+ e4 D3 X, K 那么有没有一种除了应用系统以外不需要进行任何附加设置的中文编码根本解决方案呢?! t) }! v& A, K6 b" g5 ~
将Java/J2EE系统的统一编码定义为UTF-8。UTF-8编码是一种兼容所有语言的编码方式,惟一比较麻烦的就是要找到应用系统的所有出入口,然后使用UTF-8去“结扎”它。& A+ Z l7 F" H6 G( i- o* G1 n
一个J2EE应用系统需要做下列几步工作:! o1 V7 o/ y* t- ?- \9 s
开发和编译代码时指定字符集为UTF-8。JBuilder和Eclipse都可以在项目属性中设置。使用过滤器,如果所有请求都经过一个Servlet控制分配器,那么使用Servlet的filter执行语句,将所有来自浏览器的请求(request)转换为UTF-8,因为浏览器发过来的请求包根据浏览器所在的操作系统编码,可能是各种形式编码。关键一句:) m. i4 r N& M& p, L% Z
request.setCharacterEncoding("UTF-8")。
$ N; M* W$ C6 X) a; a! U 网上有此filter的源码,Jdon框架源码中 com.jdon.util.SetCharacterEncodingFilter& w$ A8 W' s0 d$ w1 [$ y
需要配置web.xml 激活该Filter。
* d* I4 L, `! m3 x7 a: g& O, K 在JSP头部声明:。) U2 M; q$ {, k% }. O* B5 i
在Jsp的html代码中,声明UTF-8:
5 P* \* K" s5 O6 g! E$ A9 O 设定数据库连接方式是UTF-8。例如连接MYSQL时配置URL如下:- n) w6 Y$ t- p* Y5 e
jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8
8 t# a" n4 K- g; ~" | 注意,上述写法是JBoss的mysql-ds.xml写法,多亏网友提示,在tomcat中&要写成&即可。一般其他数据库都可以通过管理设置设定UTF-8" S. ]& y( K7 Y( |; O
其他和外界交互时能够设定编码时就设定UTF-8,例如读取文件,操作XML等。
; v! H/ C4 i- N8 X2 y% U 笔者以前在Jsp/Servlet时就采取这个原则,后来使用Struts、Tapestry、EJB、Hibernate、Jdon等框架时,从未被乱码困扰过,可以说适合各种架构。希望本方案供更多初学者分享,减少Java/J2EE的第一个拦路虎,也避免因为采取一些临时解决方案,导致中文问题一直出现在新的技术架构中。 |