`
flashdream8
  • 浏览: 680770 次
  • 性别: 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】

    它能够实时地抓取通过网络接口的数据包,并提供详细的解析结果,使得用户能够快速定位网络问题的原因,是网络工程师和安全分析师等专业人士常用的工具之一。 ### 激活码的重要性 在讨论激活码之前,我们需要先了解...

    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】

    mysql乱码处理

    具体步骤可以参考链接:[使用提示](http://www.bitscn.com/pdb/php/200701/95558.html)。 #### 六、总结与扩展 通过以上六个步骤,我们可以有效地解决PHP环境下MySQL的UTF-8乱码问题。除了上述方法之外,还可以...

    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

    win8.1系统运行GTA4出现R图标闪退的解决方法介绍.docx

    - **下载地址**:[http://.bitsCN.com/os/windows/289850.html](http://.bitsCN.com/os/windows/289850.html) 3. **设置显卡优先级** - **AMD显卡**: - 打开Catalyst Control Center,进入“电源”-&gt;“可切换...

    shell脚本编写和源码

    最后,"Linux网络备份MYSQL【转自bbs.bitsCN.com】.txt"可能是关于MySQL数据库的备份策略,可能详细介绍了如何利用Shell脚本来备份和恢复MySQL数据,这对于数据库管理员来说尤其重要。 总的来说,这个压缩包提供了...

    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. 配置...

    shell脚本的编写

    **Linux网络备份MYSQL【转自bbs.bitsCN.com】:** 这个文档专门针对MySQL数据库的备份,会介绍如何使用`mysqldump`命令创建数据库的SQL转储文件,以便在需要时恢复数据。 总的来说,Shell脚本编写是一个全面的课题...

    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

    emf eclipse

    虽然描述为空,但通过提供的博文链接(https://xblia.iteye.com/blog/1285282)我们可以推测,这篇博文可能涉及了使用EMF来构建和理解元模型的过程,以及如何在Eclipse环境下利用EMF生成具体的、可重用的Java代码。...

    Linux phpMyAdmin 安装攻略

    - 如果出现此提示,需要设置`$cfg['blowfish_secret']`,例如`$cfg['blowfish_secret'] = 'bbs.bitscn.com'`。 8. **解决“无法载入mcrypt扩展”问题**: - 将`libmcrypt.dll`与`php_mcrypt.dll`复制到系统路径中...

    oracle 性能调整 sql性能优化大全

    Oracle数据库性能调整与SQL性能优化是数据库管理员和开发人员日常工作中不可或缺的部分。Oracle数据库系统以其高效、稳定和可扩展性闻名,但同时也需要通过精心的调整和优化来确保最佳性能。以下是一些关键的知识点...

    OicqHack--

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

    informix学习资料

    它可能是由“中国网管联盟-网管网-bitsCN.com”提供的,这通常是一个技术交流平台,为用户提供实用的技术教程。 2. "informix初始化都做了写什么? - 厦门人家v2008.htm" — 这篇文章可能探讨了Informix数据库的初始...

    linux集群理论基础

    系统 服务器 负载 请求 调度 地址 域名 IP 方法 _中国网管联盟-网管网-bitsCN_com.mht”等资料,我们可以深入了解Linux集群的实现细节,学习如何设计、配置和维护一个高效的Linux集群系统。这些文档涵盖了集群的基础...

    Python中socket网络通信是干嘛的

    在给定的示例中,代码创建了一个TCP套接字,并连接到了www.bitsCN.com的80端口,这是HTTP服务的默认端口。这展示了如何使用Python的socket库进行基本的网络连接。 了解Python的socket网络通信对于编写网络应用至关...

Global site tag (gtag.js) - Google Analytics