收藏 (0) +1 (0) +1 (0) +1
收藏成功查看收藏>>

正在阅读:Java中文问题详解,底层编码解剖Java中文问题详解,底层编码解剖

2004-10-29 12:07 出处:PConline 作者:feng_sundy 责任编辑:linjixiong

  
  但是我们往往忽略掉这个参数,因此这样往往会有跨平台的问题:
  例3在中文平台上编译,生成ZhClass
  例3在英文平台上编译,输出EnClass
  1.ZhClass在中文平台上执行OK,但是在英文平台上不行
  2.EnClass在英文平台上执行OK,但是在中文平台上不行

  原因:
  1.在中文平台上编译后,其实str在运行态的char[]是0x4F60,在中文平台上运行,FileWriter的缺省编码是gb2312,因此CharToByteConverter会自动用调用gb2312的converter,把str转化成byte输入到FileOutputStream中,于是0xC4,0xE3放进了文件。但是如果是在英文平台下,CharToByteConverter的缺省值是8859_1,FileWriter会自动调用8859_1去转化str,但是他无法解释,因此他会输出"?".

  在英文平台上编译后,其实str在运行态的char[]是0x00C4 0x00E3, --在中文平台上运行,中文无法识别,因此会出现??
  在英文平台上,0x00C4-->0xC4,0x00E3->0xE3,因此0xC4,0xE3被放进了文件

  1.对于JSP正文的解释:
  Tomcat首先看一下你的页面中有没有"<%@page include的符号。有,则在相同地方设定response.setContentType(..);按照encoding的来读,没有他按照8859_1读取文件,然后用UTF-8写成.java文件,然后用sun.tools.Main去读取这个文件,(当然它使用UTF-8去读),然后编译成class文件setContentType改变的是out的属性,out变量缺省的encoding是8859_1

  2.对Parameter的解释
  很不幸Parameter只有ISO8859_1的解释,这个质料可以在servlet的实现代码中找到。

  3.对include的解释
  格式的,但是很不幸,由于那个写"org.apache.jasper.compiler.Parser"的人
  在数组JspUtil.ValidAttribute[]忘记加了一个参数:encoding,因此导致不支
  持这种方式。你完全可以编译源代码,加上对encoding的支持

  总结:

  如果你在NT底下,最简单的方法就是欺骗java,不加任何Encoding变量:


  <html>
  你好<%=request.getParameter("value")%>
  </html>

  http://localhost/test/test.jsp?value=你

  结果:你好你

  但这种方法局限性较大,比如对上传的文章分段,这样的做法是死定的,最好的
  解决方案是用这种方案:


  <%@ page contentType="text/html;charset=gb2312" %>
  <html>
  你好<%=new String(request.getParameter("value").getBytes("8859_1"),"gb2312")%>
  </html>


察看评论详细内容 我要发表评论
作者笔名 简短内容 发表时间
:
键盘也能翻页,试试“← →”键

关注我们

最新资讯离线随时看 聊天吐槽赢奖品
手机访问回到顶部