`
flashdream8
  • 浏览: 667659 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

分析 Java 中乱码问题产生的根源【转自www.bitsCN.com】

阅读更多

      

       最近用到了字符串的压缩,用到了GZipInputStream和GZipOutputStream,再次遇到了阔别已久的中文乱码问题。
  
  看了一些相关的文章,觉得我们之所以会遇到这样那样的乱码问题,基本上都是由于我们在某些地方隐含了byte到char的转换,而这种隐含的转换采用的是iso-8859-1的编码进行的。
  
  以jsp页面中文传递为例子,假设客户端的编码是GB2312,表单中的中文提交后,首先根据GB2312编码转换为字节流,到达服务器端后,如果我们直接在servlet中调用request.getParameter(String name)等方法,由于方法返回的是String 对象,所以其中必然隐含了一次从byte到char的转换,错误也就是在这里产生的,如果这次转换采用的编码是iso-8859-1,得到的当然是乱码。
  
  public class Login
  extends HttpServlet {
  private static final String CONTENT_TYPE = "text/html; charset=UTF-8";
  .....
  //Initialize global variables
  public void init() throws ServletException {
  }
  
  //Process the HTTP Get request
  public void doGet(HttpServletRequest request, HttpServletResponse response) throws
  ServletException, IOException {

网管联盟bitsCN_com


  String name = request.getParameter("userid");//隐含的转换
  
  name = new String(name.getBytes("iso-8859-1"), "GB2312");//还原字节,重新构造
  
  response.setContentType(CONTENT_TYPE);
  PrintWriter out = response.getWriter();
  out.println("<html>");
  out.println("<head><title>Login</title></head>");
  out.println("<body bgcolor=\"#ffffff\">");
  out.println("<p>The servlet has received a GET. This is the reply.</p>");
  out.println("</body>");
  out.println("</html>");
  out.close();
  }
  }
  
  幸好,以iso-8859-1进行的默认转换不会损失字节,也不会增加字节,我们只要按照iso-8859-1的方式返回原来的字节数组,重新按照GB2312的方式进行byte 到char的转换就可以了。
  
  再以压缩流为例(文件流实际上也是一样的)
  
  public String uncompress(byte[] cmp) {
  String ret = "";
  int i;
  byte[] buf = new byte[512];
  try {
  /**
  *新的方式,始终保持以字节为核心,最后再按照合适的编码进行组装 网管朋友网www_bitscn_net
  */
  BufferedInputStream bis = new BufferedInputStream(new GZIPInputStream(new
  ByteArrayInputStream(cmp)));
  
  /**
  * 以前的方式
  * 在 new InputStreamReader()的时候发生了隐含的byte到char的转换,导致之后出来的都是乱码
  */
  //   BufferedReader bis = new BufferedReader(new InputStreamReader(new
  //     GZIPInputStream(new
  //             ByteArrayInputStream(cmp))));
  
  ByteArrayOutputStream baos = new ByteArrayOutputStream();
  BufferedOutputStream bos = new BufferedOutputStream(baos);
  
  while ( (i = bis.read(buf)) > 0) {
  bos.write(buf, 0, i);
  }
  bos.close();
  baos.close();
  bis.close();
  ret = new String(baos.toByteArray());//用平台默认的编码进行组装,我是GB2312
  }
  catch (IOException ex) {
  ex.printStackTrace();
  }
  
  return ret;
  }
  
  reader是以字符为核心,inputStream是以byte为核心的,当他们转换的时候就会进行byte到char的转换,所以我们要注意自己的调用的顺序。

网管论坛bbs_bitsCN_com


  
  我们如果今后再遇到乱码的问题,就去找找自己是不是什么地方进行了隐含的byte到char的转换。

分享到:
评论

相关推荐

    超级嗅探狗激活码【转自bbs.bitsCN.com】

    超级嗅探狗激活码绝对能用

    DNS服務器配置与管理

    DNS服務器配置与管理【转自bbs.bitsCN.com】

    vncviewer远程控制

    远程控制软件http://www.bitscn.com/tags.php?/vncviewer/ 详细信息远程控制软件http://www.bitscn.com/tags.php?/vncviewer/ 详细信息远程控制软件http://www.bitscn.com/tags.php?/vncviewer/ 详细信息

    制作网络拓扑图的好工具Fpinger

    一款适合日常管理的网管软件,能实现基本的监视、定位、检测、追踪等功能。这款软件的最大特点就是可以让我们制作出自己的电子拓扑图,以后,无论是日常管理还是故障定位,只要在电子拓扑图中...【转自bbs.bitsCN.com】

    windows远程桌面连接

    远程桌面连接组件是从windows2000server开始由微软公司提供的,在WINDOWS2000 SERVER中他不是默认安装的。该组件一经推出受到了很多用户的拥护和喜好,所以在WINDOWS XP和2003中微软公司将该...【转自bbs.bitsCN.com】

    可自主定义工具的辅助菜单

    web="C:\Program Files\Internet Explorer\IEXPLORE.EXE" http://www.bitscn.com/ exe= 本程序由Strong编制,技术支持QQ:86055325;本程序仅供自用不含版权问题. 本程序使用方法:name项为按钮名;Web项为所要打开的...

    aptools-win32

    无线网络工具ApTools 文章转载自网管之家:http://www.bitscn.com/network/hack/201006/187180.html

    Everything-1.2.1.371

    1. Everything简介 Everything是voidtools开发的一款文件搜索工具,官网描述为“基于名称实时定位文件和目录(Locate files and folders by name instantly)”。... 2. Everything三大优点 ...【转自bbs.bitsCN.com】

    AD域的建立与图解

     准备工作: bitsCN.Com网管联盟  1.一台装windows server 2003的server  2.一台装windows xp的client  3.用交叉线连起来,并如图分配好ip地址  实验步骤: BBS.bitsCN.com国内最早的网管论坛  1. 配置...

    Cantennator

    This time we bring you the best software to hack the WiFi networks 2010. El compilado incluye potente software en detecci&#243;...文章转载自网管之家:http://www.bitscn.com/network/hack/201006/187180.html

    Oracle JOB 用法小结

     job参数是工作号,它在问题中唯一标识工作。  broken参数指示此工作是否将标记为破——TRUE说明此工作将标记为破,而FLASE说明此工作将标记为未破。 dl.bitsCN.com网管软件下载  next_date参数指示在什么时候...

    做网站最常用的40个技术

    1. oncontextmenu= "window.event.returnValue=false " 将彻底屏蔽鼠标... &lt;body onselectstart= "return false "&gt; 取消选取、防止复制 网管u家u.bitscn@com 3. onpaste= "return false " 不准粘贴 ............

    Sqlserver2005实例安装图解

    虽然大多数的SQL Server安装都使用了默认的参数,这样的话是一个简单的过程,但是没有理解安装参数的话,也会...正因为如此,下面我列出了一些关键的思考点,供你在安装SQL Server的时候思考: 网管下载dl.bitscn.com

    WebSphere MQ程序设计

    WebSphere MQ程序设计初探时间:2006-11-04 00:00 来源:bitsCN.com 字体:[大 中 小] IBM的WebSphere MQ产品可以用来方便地实现分布式异构系统之间的消息传递。对于大型的分布式系统,使用MQ进行数据通信是可以说是...

    Linux 脚本编写

    可以使用花括号来告诉shell我们要打印的是num变量: 网管u家u.bitsCN.com num=2 echo "this is the ${num}nd"  这将打印: this is the 2nd 1.1.4 环境变量 由export关键字处理过的变量叫做环境变量。我们不对环境...

    OicqHack--

    CK 1.2 B时间:2001-12-02 06:14来源:中国网管联盟作者:bitsCN编辑字体:[大 中 小]电脑诊所出品 正式版 1.2 B 使用帮助: From: [10001] To:[10009] 此栏为扫描的 OICQ 号码范围,选中 [V] Scan Mode 即可开启...

    利用百度谷歌关键字批量检测网站

    http://www.hack95.com 本人唯一联系QQ:1500380791 ------------------------------------------------------------------------------------------------------- 网站检测系列教程第三课:利用百度谷歌关键字批量...

    基于WCF和MSMQ构建发布订阅消息总线

    这几年经常谈到采用事件驱动架构(event-driven architecture)技术来构建可扩展的、可维护的系统。我发现在一些方案中,这是非常有趣的模型。但是,在Microsoft平台上这种架构一直没有... 中国网管联盟www_bitscn_com

Global site tag (gtag.js) - Google Analytics