现在的位置: 首页 > 综合 > 正文

有关浏览器和服务端字符乱码的问题

2018年03月29日 ⁄ 综合 ⁄ 共 3297字 ⁄ 字号 评论关闭
通过前两篇文章,我们已经基本搞清楚了几种字符编码之间的关系和方式,现在,我们来几种解决各种字符乱码等问题:

在d:盘分别建立三个文件。分别保存为三种编码方式:
a.txt:unicode,
b.txt:utf-8,
c.txt:ansi

程序如下:
package org.encode.demo;

import java.io.File;
import java.io.FileInputStream;

public class EncodeDemo {
        
        public static void getString(String path,String encodeMethod){
        File file = new File(path);
        try {
            FileInputStream is = new FileInputStream(file);
            byte[] bs = new byte[255];
            int endIndex = is.read(bs);
            System.out.println();
            String str = new String(bs, 0, endIndex,encodeMethod);
            System.out.println(str);
        } catch (Exception e) {
            e.printStackTrace();
        }
        }
    /**
     * @param args
     */
    public static void main(String[] args) {
         EncodeDemo.getString("d://a.txt","unicode");
         EncodeDemo.getString("d://b.txt","utf-8");
         EncodeDemo.getString("d://c.txt","gb2312");
    }
}

分别能得到正确的字符;

看下列程序:
                        String str2="a";
            byte[] bs2=str2.getBytes(encodeMethod);
            System.out.println(bs2.length);

unicode:4
utf-8:1
gb2312:1

可见,utf-8相对于unicode是变长的;
<%@ page language="java" import="java.util.*" pageEncoding="gb2312"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
  </head>
 
  <body>
    大家好
  </body>
</html>
用gb2312输出,到浏览器上访问的时候,我们能看到正常的中文;
当我们用uft-8输出的时候,浏览器根据输出编码类型,自动采用其相应的编码方式进行解码;

同样,servlet也是同样的道理:
    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        response.setContentType("text/html");
        response.setCharacterEncoding("gb2312");
        PrintWriter out = response.getWriter();
        out.println("大家好");
    }
从服务端到浏览器端,只要设置了编码方式,浏览器就会根据相应的编码方式来解码,这个过程是自动的;

现在我们可以讨论一下从浏览器端传送数据到服务端的编码问题,同时,这也是乱码出现最多的地方;
<body>
    <form action="./charset" method="post">
    name:<input type="text" name="name"/><br>
    password<input type="password" name="pwd"/><br>
    <input type="submit" value="提交" />
  </body>
在index.jsp里面构造一个表单,表单里面填写中文,传入后台servlet
public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        String name = request.getParameter("name");
        String pwd = request.getParameter("pwd");
        PrintWriter out = response.getWriter();
        out.println(name);
        out.println(pwd);
    }

index.jsp是utf-8的,那么上传的表单中的中文自然就是utf-8的编码;在firebug下我们可以见到:
Response Headers
Server    Apache-Coyote/1.1
Content-Type    text/html;charset=utf-8
Content-Length    323
Date    Wed, 27 Aug 2008 15:48:41 GMT
Request Headers
Host    127.0.0.1:8080
User-Agent    Mozilla/5.0 (Windows; U; Windows NT 5.0; zh-CN; rv:1.8.1.14) Gecko/20080404 Firefox/2.0.0.14
Accept    text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
Accept-Language    zh-cn,zh;q=0.5
Accept-Encoding    gzip,deflate
Accept-Charset    gb2312,utf-8;q=0.7,*;q=0.7
Keep-Alive    300
Connection    keep-alive
Cookie    JSESSIONID=9A31884D9B5987C28D113A16B486EE53

反之将index.jsp设置成为gb2312的,那么表单中的字符编码就是gb2312的格式;
所以,我们后台在拿前台的数据的时候,必须知道前台传过来的数据是什么编码方式的,我们才能利用相应的解码方式:
如:
request.setCharsetEncoding("gb2312");
然后,我们可以利用request.setCharsetCoding("htf-8");
输出,在前台,我们必须手动把编码方式设置成为utf-8;所以说浏览器的自动选择解码方式是有一定的不可信赖性的;
但是输出unicode浏览器可以正确的选择;

有的时候,我们采用js lib的时候,比如ext,他里面采用了unicode ajax传递数据,那么,就不是怎么把页面设置成为gb2312就使用gb2312传

递表单数据啦

抱歉!评论已关闭.