zoukankan      html  css  js  c++  java
  • 字符编码乱码问题(servlet底层 编码大揭秘)

    好多初学者会遇到,请求过去的信息内包含中文(一般会是get方式提交过去的请求会出现)。好郁闷,这是为什么呢。有下面分析下,说的不好可以吐槽

    话说我们能遇到这种编码的问题,归根结底就是这  这 web开发不是中国人开发的,中国文化博大精深,四大发明渊源流传,可惜,我们太自己为是了,来了个闭关锁国政策,弄得中国跟不上时代的步伐,不潮了,落伍了,互联网时代被西方人抢了个先,发明了,我们只能用别人的了。我们也知道,西方讲的是英语,所以他们采用的编码格式是iso-8895-1。而这  这种编码方式只占两个字节,不适合我们中文(不光是中文,其他的语言也不怎么支持,嘿嘿),所以,为了世界各国的语言都支持,Ken Thompson(有一外国人,where is 中国人),发明了utf-8编码格式,是可变长度字符编码的万能码(又有多少真正被堪称万能的,牛)。其中,中文占3个字节。所以  所以想服务器发送请求的时候,get方式都要转码。

    废话不多说,正题例子才霸气。

    package com.servlet;
    
    import java.io.IOException;
    
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    public class Register extends HttpServlet
    {
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp)
                throws ServletException, IOException
        {
            process(req, resp);
        }
        
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp)
                throws ServletException, IOException
        {
            process(req, resp);
        }
        
        public void process(HttpServletRequest req, HttpServletResponse resp)
                throws ServletException, IOException
        {
            req.setCharacterEncoding("UTF-8");
            resp.setContentType("text/html");
            
            String usernmae = req.getParameter("username");
            String gender = req.getParameter("gender");
            String[] interest = req.getParameterValues("interest");
            String address = req.getParameter("address");
            String connent = req.getParameter("connent");
            
            usernmae = new String(usernmae.getBytes("iso-8859-1"),"UTF-8");//字符的解码和转码,iso-8859-1代表的2个字节大小,utf-8各个国家中的
            gender = new String(gender.getBytes("iso-8859-1"),"UTF-8");
            connent = new String(connent.getBytes("iso-8859-1"),"UTF-8");
            address = new String(address.getBytes("iso-8859-1"),"UTF-8");
            
            
            System.out.println(usernmae);
            System.out.println(gender);
            System.out.println(interest.length);
            System.out.println(address);
            System.out.println(connent);
        }
    }
    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <meta content="">
    <title>Insert title here</title>
    <script type="text/javascript">
        function validate()
        {
            var username = document.getElementsByName("username")[0];
            if(username.value.length < 1)
                {
                    alert("用户名不能为空");
                }
            
            var gender = document.getElementsByName("gender");
            if(!gender[0].checked && !gender[1].checked)
                {
                alert("请选择性别");
                }
            
            var interest = document.getElementsByName("interest");
            
            var n = 0;
            for(var i = 0; i < interest.length; i++)
                {
                    if(interest[i].checked)
                        n++;
                }
            if(n < 1)
                {
                alert("兴趣至少选择一个");
                }
            var address = document.getElementsByName("address");
            
            
        }
    </script>
    </head>
    <body>
    
    <form action="Register">
        用户名:<input name="username" type="text"><br>
        性别:男<input type="radio" value="男" name="gender">&nbsp;&nbsp;&nbsp;<input type="radio" value="女" name="gender">
        <br>
        兴趣:足球<input type="checkbox" name="interest" value="足球">&nbsp;&nbsp;
        蓝球<input type="checkbox" name="interest" value="篮球">&nbsp;&nbsp;
        羽毛球<input type="checkbox" name="interest"value="羽毛球">&nbsp;&nbsp;
        拍球<input type="checkbox" name="interest" value="排球">&nbsp;&nbsp;<br>
        地址:<select name="address">
            <option value="上海">上海</option>
            <option  value="天津">天津</option>
            <option value="济南">济南</option>
            <option value="德州">德州</option>
        </select>
        <br>说明:<textarea name="connent" rows="15" cols="20"></textarea><br>
        <input type="submit" onclick="validate()" value="充值">
    &nbsp;</form>
    </body>
    </html>
    usernmae = new String(usernmae.getBytes("iso-8859-1"),"UTF-8");
    理解,usernmae.getBytes("iso-8859-1")就是以iso-8859-1的方式得到username。然后新建一个string类型的字符串,将其编码格式定位utf-8,就完活了,简单不,不过,还是那句话,为什么web不是中国人发明的。让老外也尝尝编码的苦楚。
  • 相关阅读:
    Python合集之Python循环语句(二)
    io流2
    io流
    集合工具类
    泛型
    Map
    VSCode_Extensions
    C++ in VSCode
    C# 私有字段前缀 _ 的设置(VS2019, .editorconfig)
    dotnet 跨平台编译发布
  • 原文地址:https://www.cnblogs.com/feiguo/p/3762268.html
Copyright © 2011-2022 走看看