`
wxlgzxx_1988
  • 浏览: 69991 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Cookie中保存中文乱码 解决办法

阅读更多

以前用cookie只是存一些简单的英文串或者其他的登录信息,没有涉及到中文,所以对cookie也没多作研究,最近一项目中需要用到cookie,并且要用cookie存储中文信息,不料却出现差错,存进去了,发现数据库表里全是乱码,而且对cookie串拆分,读出来的发现并不是自己想要的结果。后来发现存储中文需要有一个编码,读出来的时候以同样的编码方式解码。
中文与英文字符不同,中文属于Unicode字符,在内存中占4个字符,而英文属于ASCII字符,内存中只占2个字节。Cookie中使用Unicode字符时需要对 Unicode字符进行编码,否则会乱码。编码可以使用java.net.URLEncoder类的encode(String str, String encoding)方法,解码使用java.net.URLDecoder类的decode(String str, String encoding)方法,例如:
// 使用中文的 Cookie. name 与 value 都使用 UTF-8 编码

    Cookie cookie = new Cookie(

        URLEncoder.encode("姓名", "UTF-8"),

        URLEncoder.encode("老王", "UTF-8"));

    response.addCookie(cookie); // 发送到客户端
读取时候:
if(request.getCookies() != null){

        for(Cookie cc : request.getCookies()){      // 遍历所有的Cookie

            String cookieName = URLDecoder.decode(cc.getName(), "UTF-8");

            String cookieValue = URLDecoder.decode(cc.getValue(), "UTF-8");

           
            out.println(cookieName + "=" + cookieValue + "; <br/>");

        }

    }
%提示:Cookie中保存中文只能编码。一般使用UTF-8编码即可。不推荐使用GBK等中文编码,因为浏览器不一定支持,而且JavaScript也不支持GBK编码。

    Cookie不仅可以使用ASCII字符与Unicode字符,还可以使用二进制数据。例如在Cookie中使用数字证书,提供安全度。使用二进制数据时也需要进行编码。下面的例子使用BASE64编码在Cookie中保存二进制文件:
   File file = new File(this.getServletContext().getRealPath("cookie.
    gif"));

   

    byte[] binary = new byte[(int)file.length()];       // 二进制数组

   

    // 从图片文件读取二进制数据.

    InputStream ins = this.getServletContext().getResourceAsStream
    (file.getName());

    ins.read(binary);

    ins.close();    

    String content = BASE64Encoder.class.newInstance().encode(binary);
    // BASE64 编码     

    Cookie cookie = new Cookie("file", content);
     // 包含二进制数据的 Cookie

    response.addCookie(cookie);    // 将 Cookie 发送到客户端

从 Cookie 中获取到的二进制图片:<img src="base64_decode.jsp" /> <br/>

<textarea id='cookieArea' style='width:100%; height:200px; '></textarea>

<script type="text/javascript">cookieArea.value=document.cookie;</script>
程序使用的二进制数据来自根目录下的cookie.gif文件。程序先将二进制数据写进客户端Cookie中,然后又将Cookie中的二进制数据还原并显示。输入框中用JavaScript程序显示了客户端Cookie的所有内容。

解码并显示图片的源代码如下:
out.clear();                                    // 清除输出

    for(Cookie cookie : request.getCookies()){      // 遍历Cookie

        if(cookie.getName().equals("file")){        // 找到名为file的Cookie

           

            byte[] binary =

            BASE64Decoder.class.newInstance().decodeBuffer(cookie.
            getValue().replace(" ", ""));   // 解码BASE64编码的二进制内容

                       

            response.setHeader("Content-Type", "image/gif");
                                            // 设置内容类型为 gif 图片

            response.setHeader("Content-Disposition", "inline;
            filename=cookie.gif");
[color=blue][/color][size=x-small][/size]
            response.setHeader("Connection", "close");         

            response.setContentLength(binary.length);   // 设置输出内容的长度

            response.getOutputStream().write(binary);   // 输出到客户端

            response.getOutputStream().flush();     // 清空缓存

            response.getOutputStream().close();     // 关闭输出流

            return;

        }

    }
%注意:本程序仅用于展示Cookie中可以存储二进制内容,并不实用。由于浏览器每次请求服务器都会携带Cookie,因此Cookie内容不宜过多,否则影响速度。Cookie的内容应该少而精。

分享到:
评论

相关推荐

    用Javascript读取中文COOKIE的解决办法

    ### 用Javascript读取中文COOKIE的解决办法 #### 背景与问题描述 在Web开发中,Cookies是一种常见的客户端存储技术,用于保存用户的偏好设置、登录状态等信息。然而,在处理包含中文字符的Cookies时,开发人员经常...

    Java web面试题

    解决办法包括确保所有相关文件和配置中的字符集设置一致,以及在请求处理过程中正确设置响应的字符集。 **13.1 JSP的缺点** 尽管JSP提供了一种简单的方式来生成动态内容,但它也有一些缺点: - 混合HTML和Java...

    JSPJSP.doc

    解决办法是确保服务器端和客户端的字符编码一致,通常在接收请求参数时设置正确的字符编码,如`request.setCharacterEncoding("UTF-8")`。 4. **`forward()`错误** 如果执行`request.getRequestDispatcher("页面")...

    商用版本文本编辑器DotNetTextBoxV6.0.8Source 源码

    3)增加了在IE8浏览器下控件显示不正确的解决办法(更新到faq.htm页面)! 2009/03/23 Version 6.0.2 For VS2005/2008 Updates: 1)修正多文件上传的严重BUG! 2)优化了多文件上传的性能! 3)优化了多文件上传时的一些...

    C#编程经验技巧宝典

    73 &lt;br&gt;0106 如何获得一个字符串中数字的长度 74 &lt;br&gt;0107 如何获得字符串中数字或字母的长度 74 &lt;br&gt;0108 如何获得字符串中某个数字的位置 75 &lt;br&gt;0109 获得字符串中汉字的个数 76 &lt;br&gt;0110...

    AppDirector负载均衡器指导书2.1X

    - **解决办法**:调整终端编码设置或使用支持中文的字体。 **3.9 设备名称** - **重要性**:便于管理和识别。 - **操作**:在 WEB 管理界面中设置设备名称。 **3.10 管理界面** - **功能**:提供图形化的配置和...

Global site tag (gtag.js) - Google Analytics