• 字符乱码出现的原因及解决办法


    1.字符乱码出现的原因:

    出现乱码是由于数据在传递和接受过程中字符编码格式不一致导致的。

    for examples:

    输入11-->在2进制中代表的是3
             -->在8进制中代表的是9
             -->在16进制中代表的17
    

      在这里同样输入的都是11,但是由于进制的不一样,所以代表的值也不一样。

    同理,编码在底层都是一串字节码,由于编码格式的不同,比如以UTF-8编码格式进行编码,以iso8859-1编码格式就无法进行解析,所以所展现出来的字符串就不是原先的字符串了。

    2.字符乱码的解决方式

    2.1将乱码先进行编码,在进行解码(不管是get请求还是post请求都适用)

    String userCount = User.getUserCount();
    //将乱码字符串按照错误的编码格式转换为原始的字节码序列
    byte[] bs = userCount.getBytes("iso889-1");
    //将原始的字节码序列使用正确的编码格式进行编码,转换为正确的文字
    userCount  = new String(bs,"utf-8");
    

    2.2使用spring框架构建项目的话可以使用编码过滤器(post请求方式)

    在web.xml中添加:  

    <filter>
        <filter-name>encoding</filter-name>
        <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
      </filter>
      <filter-mapping>
        <filter-name>encoding</filter-name>
        <servlet-name>springmvc</servlet-name>
      </filter-mapping>
    

      <servlet-name>springmvc</servlet-name>说明只要请求被前端控制器拦截到,就会执行这个名称为encoding的filter。

     CharacterEncodingFilter的源码如下:

    public class CharacterEncodingFilter extends OncePerRequestFilter {
        /*设置了两个属性encoding和forceEncoding,encoding代表的是编码格式,forceEncoding表示是否启用*/
        private String encoding;
        private boolean forceEncoding = false;
    
        public CharacterEncodingFilter() {
        }
    
        public void setEncoding(String encoding) {
            this.encoding = encoding;
        }
    
        public void setForceEncoding(boolean forceEncoding) {
            this.forceEncoding = forceEncoding;
        }
    
        protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
            /*当编码格式不为空以及forceEncoding为true时,那么设置就将服务器端的编码格式设置为配置文件中设置的编码格式*/
            if (this.encoding != null && (this.forceEncoding || request.getCharacterEncoding() == null)) {
          //只能修改请求体中编码方式 request.setCharacterEncoding(
    this.encoding); if (this.forceEncoding) { response.setCharacterEncoding(this.encoding); } } filterChain.doFilter(request, response); } }

    所以需要在web.xml中设置encoding和forceEncoding的初始化值

      <filter>
        <filter-name>encoding</filter-name>
        <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
        <init-param>
          <param-name>encoding</param-name>
          <param-value>UTF-8</param-value>
        </init-param>
        <init-param>
          <param-name>forceEncoding</param-name>
          <param-value>true</param-value>
        </init-param>
      </filter>
      
      <filter-mapping>
        <filter-name>encoding</filter-name>
        <servlet-name>springmvc</servlet-name>
      </filter-mapping>

    2.3如果是本地的项目的话,可以在tomcat的配置文件server.xml中修改编码格式 (get请求)

    <Connector URIEncoding="UTF-8" port="8080" protocol="HTTP/1.1"
                   connectionTimeout="20000"
                   redirectPort="8443" />
    

      在server.xml配置文件下,添加属性URIEncoding="UTF-8"

    总结:字符乱码问题需要分get请求和post请求。

  • 相关阅读:
    10分钟学会在Ubuntu 18.04 LTS上安装NFS服务器和客户端
    脱发、秃头防不胜防?这里有一份给码农的减压指南 [转自机器之心]
    Ubuntu通过apt-get安装指定版本和查询软件源有多少个版本
    ubuntu tree 查看目录结构
    Clion快捷键
    斜杠与反斜杠的记法
    C++ 既有约定
    docker其他参考资料
    标准错误重定向、标准输入重定向
    第一本Docker书读书笔记
  • 原文地址:https://www.cnblogs.com/wsxdev/p/11432122.html
Copyright © 2020-2023  润新知