最近用到了字符串的压缩,用到了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的转换。
分享到:
相关推荐
它能够实时地抓取通过网络接口的数据包,并提供详细的解析结果,使得用户能够快速定位网络问题的原因,是网络工程师和安全分析师等专业人士常用的工具之一。 ### 激活码的重要性 在讨论激活码之前,我们需要先了解...
远程控制软件http://www.bitscn.com/tags.php?/vncviewer/ 详细信息远程控制软件http://www.bitscn.com/tags.php?/vncviewer/ 详细信息远程控制软件http://www.bitscn.com/tags.php?/vncviewer/ 详细信息
一款适合日常管理的网管软件,能实现基本的监视、定位、检测、追踪等功能。这款软件的最大特点就是可以让我们制作出自己的电子拓扑图,以后,无论是日常管理还是故障定位,只要在电子拓扑图中...【转自bbs.bitsCN.com】
具体步骤可以参考链接:[使用提示](http://www.bitscn.com/pdb/php/200701/95558.html)。 #### 六、总结与扩展 通过以上六个步骤,我们可以有效地解决PHP环境下MySQL的UTF-8乱码问题。除了上述方法之外,还可以...
远程桌面连接组件是从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 文章转载自网管之家:http://www.bitscn.com/network/hack/201006/187180.html
- **下载地址**:[http://.bitsCN.com/os/windows/289850.html](http://.bitsCN.com/os/windows/289850.html) 3. **设置显卡优先级** - **AMD显卡**: - 打开Catalyst Control Center,进入“电源”->“可切换...
最后,"Linux网络备份MYSQL【转自bbs.bitsCN.com】.txt"可能是关于MySQL数据库的备份策略,可能详细介绍了如何利用Shell脚本来备份和恢复MySQL数据,这对于数据库管理员来说尤其重要。 总的来说,这个压缩包提供了...
1. Everything简介 Everything是voidtools开发的一款文件搜索工具,官网描述为“基于名称实时定位文件和目录(Locate files and folders by name instantly)”。... 2. Everything三大优点 ...【转自bbs.bitsCN.com】
准备工作: bitsCN.Com网管联盟 1.一台装windows server 2003的server 2.一台装windows xp的client 3.用交叉线连起来,并如图分配好ip地址 实验步骤: BBS.bitsCN.com国内最早的网管论坛 1. 配置...
**Linux网络备份MYSQL【转自bbs.bitsCN.com】:** 这个文档专门针对MySQL数据库的备份,会介绍如何使用`mysqldump`命令创建数据库的SQL转储文件,以便在需要时恢复数据。 总的来说,Shell脚本编写是一个全面的课题...
This time we bring you the best software to hack the WiFi networks 2010. El compilado incluye potente software en detecció...文章转载自网管之家:http://www.bitscn.com/network/hack/201006/187180.html
虽然描述为空,但通过提供的博文链接(https://xblia.iteye.com/blog/1285282)我们可以推测,这篇博文可能涉及了使用EMF来构建和理解元模型的过程,以及如何在Eclipse环境下利用EMF生成具体的、可重用的Java代码。...
- 如果出现此提示,需要设置`$cfg['blowfish_secret']`,例如`$cfg['blowfish_secret'] = 'bbs.bitscn.com'`。 8. **解决“无法载入mcrypt扩展”问题**: - 将`libmcrypt.dll`与`php_mcrypt.dll`复制到系统路径中...
Oracle数据库性能调整与SQL性能优化是数据库管理员和开发人员日常工作中不可或缺的部分。Oracle数据库系统以其高效、稳定和可扩展性闻名,但同时也需要通过精心的调整和优化来确保最佳性能。以下是一些关键的知识点...
CK 1.2 B时间:2001-12-02 06:14来源:中国网管联盟作者:bitsCN编辑字体:[大 中 小]电脑诊所出品 正式版 1.2 B 使用帮助: From: [10001] To:[10009] 此栏为扫描的 OICQ 号码范围,选中 [V] Scan Mode 即可开启...
它可能是由“中国网管联盟-网管网-bitsCN.com”提供的,这通常是一个技术交流平台,为用户提供实用的技术教程。 2. "informix初始化都做了写什么? - 厦门人家v2008.htm" — 这篇文章可能探讨了Informix数据库的初始...
系统 服务器 负载 请求 调度 地址 域名 IP 方法 _中国网管联盟-网管网-bitsCN_com.mht”等资料,我们可以深入了解Linux集群的实现细节,学习如何设计、配置和维护一个高效的Linux集群系统。这些文档涵盖了集群的基础...
在给定的示例中,代码创建了一个TCP套接字,并连接到了www.bitsCN.com的80端口,这是HTTP服务的默认端口。这展示了如何使用Python的socket库进行基本的网络连接。 了解Python的socket网络通信对于编写网络应用至关...