java

位置:IT落伍者 >> java >> 浏览文章

浅析Servlet和Jsp中的多国语言显示


发布日期:2024年01月24日
 
浅析Servlet和Jsp中的多国语言显示

因为一直不信Java竟会有不能混排显示多国语言的BUG这个周末研究了一下ServletJsp的多国语言显示的问题也就是Servlet的多字符集问题由于我对字符集的概念还不是很清晰所以写出的东西未必是准确的我是这样理解Java中的字符集的在运行时每个字符串对象中存储的都是编码为UNICODE内码的(笔者认为所有的语言中都是有相应编码的因为在计算机内部字符串总是用内码来表示的只不过一般计算机语言中的字符串编码时平台相关的而Java则采用了平台无关的UNICODE)

Java从一个byte流中读取一个字符串时将把平台相关的byte转变为平台无关的Unicode字符串在输出时Java将把Unicode字符串转变为平台相关的byte流如果某个Unicode字符在某个平台上不存在将会输出一个´?´举个例子在中文Windows中Java读出一个GB编码的文件(可以是任何流)到内存中构造字符串对象将会把GB编码的文字转变为Unicode编码的字符串如果把这个字符串输出又将会把Unicode字符串转化为GB的byte流或数组中文测试>ueduudbubd>中文测试

byte[] bytes = new byte[]{(byte)xd (byte)xd (byte)xce (byte)xc (byte)xb (byte)xe (byte)xca (byte)xd};//GBK编码的中文测试

javaioByteArrayInputStream bin = new javaioByteArrayInputStream(bytes);

javaioBufferedReader reader =new javaioBufferedReader(new javaio InputStreamReader (binGBK));

String msg = readerreadLine();

Systemoutprintln(msg)

这段程序放到包含中文测试这四个字的系统(如中文系统)中可以正确地打印出这些字msg字符串中包含了正确的中文测试的Unicode编码ueduudbubd打印时转换为操作系统的默认字符集是否可以正确显示依赖于操作系统的字符集只有在支持相应字符集的系统中我们的信息才能正确的输出否则得到的将会是垃圾

话入正题我们来看看Servlet/Jsp中的多语言问题我们的目标是任一国家的客户端通过Form向Server发送信息Server把信息存入数据库中客户端在检索时仍然能够看到自己发送的正确信息事实上我们要保证最终Server中的SQL语句中保存的时包含客户端发送文字的正确Unicode编码DBC与数据库通讯时采用的编码方式能包含客户端发送的文字信息事实上最好让JDBC直接使用UNICODE/UTF与数据库通讯!这样就可以确保不会丢失信息Server向客户端发送的信息时也要采用不丢失信息的编码方式也可以是Unicode/Utf

如果不指定Form的Enctype属性Form将把输入的内容依照当前页面的编码字符集urlencode之后再提交服务器端得到是urlencoding的字符串编码后得到的urlencoding字符串是与页面的编码相关的如gb编码的页面提交中文测试得到的是%D%D%CE%C%B%E%CA%D每个后跟的是进制的字符串而在UTF编码时得到的却是%E%B%AD%E%%%E%B%B%E%AF%因为GB编码中一个汉字是位的而UTF中一个汉字却是位的中日韩三国的ie以上浏览器均支持UTF编码这种方案肯定包涵了这三国语言所以我们如果让Html页面使用UTF编码那么将至少可以支持这三国语言

但是如果我们html/Jsp页面使用UTF编码因为应用程序服务器可能不知道这种情况因为如果浏览器发送的信息不包含charset信息至多Server知道读到AcceptLanguage请求投标我们知道仅靠这个投标是不能获知浏览器所采用编码的所以应用程序服务器不能正确解析提交的内容为什么?因为Java中的所有字符串都是Unicode位编码的HttpServletRequestrequest(String)的功能就是把客户端提交的Urlencode编码的信息转为Unicode字符串有些Server只能认为客户端的编码和Server平台相同简单地使用URLDecoderdecode(String)方法直接解码如果客户端编码恰好和Server相同那么就可以得到正确地字符串否则如果提交地字符串中包含了当地字符那么将会导致垃圾信息

               

上一篇:Java进阶 Java中具有实例缓存的不可变类

下一篇:Java进阶:Java变量类型之间的相互转换