首页 > 其他分享 >中文乱码解决(多种方法)(转)

中文乱码解决(多种方法)(转)

时间:2023-06-08 21:03:50浏览次数:36  
标签:多种 中文 编码 get request 设定 乱码 过滤器 post


使用 tomcat 时,相信大家都回遇到中文乱码的问题,具体表现为通过表单取得的中文数据为乱码。

一、初级解决方法

通过一番检索后,许多人采用了如下办法,首先对取得字符串按照 iso8859-1 进行解码转换,然后再按照 gb2312 进行编码,最后得到正确的内容。示例代码如下:

String para = new String( request.getParameter("para").getBytes("iso8859-1"), "gb2312");

具体的原因是因为美国人在写 tomcat 时默认使用 iso8859-1 进行编码造成的。

然而,在我们的 servlet 和 jsp 页面中有大量的参数需要进行传递,这样转换的话会带来大量的转换代码,非常不便。

二、入门级解决方法

后来,大家开始写一个过滤器,在取得客户端传过来的参数之前,通过过滤器首先将取得的参数编码设定为 gb2312 ,然后就可以直接使用 getParameter 取得正确的参数了。这个过滤器在 tomcat 的示例代码
jsp-examples 中有详细的使用示例,   其中过滤器在 web.xml 中的设定如下,示例中使用的是日文的编码,我们只要修改为 gb2312 即可

<filter>
         <filter-name>Set Character Encoding</filter-name>
         <filter-class>filters.SetCharacterEncodingFilter</filter-class>
         <init-param>
             <param-name>encoding</param-name>
             <param-value>EUC_JP</param-value>
         </init-param>
     </filter>过滤器的代码如下:
 public class SetCharacterEncodingFilter implements Filter {    // 编码的字符串
     protected String encoding = null;   // 过滤器的配置
     protected FilterConfig filterConfig = null;   // 是否忽略客户端的编码
     protected boolean ignore = true;   // 销毁过滤器
     public void destroy() {        this.encoding = null;
         this.filterConfig = null;    }
   // 过滤方法
     public void doFilter(ServletRequest request, ServletResponse response,
                          FilterChain chain)
           throws IOException, ServletException {        // 如果使用过滤器,忽略客户端的编码,那么使用通过过滤器设定编码
         if (ignore || (request.getCharacterEncoding() == null)) {
             String encoding = selectEncoding(request);
             if (encoding != null)
                 request.setCharacterEncoding(encoding);
         }        // 传送给下一个过滤器
         chain.doFilter(request, response);    }
     // 初始化过滤器
     public void init(FilterConfig filterConfig) throws ServletException {        this.filterConfig = filterConfig;
         this.encoding = filterConfig.getInitParameter("encoding");
         String value = filterConfig.getInitParameter("ignore");
         if (value == null)
             this.ignore = true;
         else if (value.equalsIgnoreCase("true"))
             this.ignore = true;
         else if (value.equalsIgnoreCase("yes"))
             this.ignore = true;
         else
             this.ignore = false;    }
    // 返回过滤器设定的编码
     protected String selectEncoding(ServletRequest request) {        return (this.encoding);
    }
 }

然而在 tomcat5 中,即使使用过滤器,仍然可能取得乱码,原因何在呢?

三、高级解决方法

这是因为,在 tomcat4 和 tomcat5 中对参数的处理是不一样的,在 tomcat4 中 get 与 post 的编码是一样的,所以只要在过滤器中通过 request.setCharacterEncoding 设定一次就可以解决 get 与 post 的问题。然而,在 tomcat5 中,get 与 post 的处理是分开进行的

在 tomcat 5 中,为了解决编码问题,tomcat 的作者作了很多努力,具体表现为在 tomcat 的配置文件 server.xml 中对 Connector 元素增加了如下的配置参数,专门用来对编码进行直接的配置

URIEncoding   用来设定通过 URI 传递的内容使用的编码,tomcat 将使用这里指定的编码对客户端传送的内容进行编码。

什么是 URI 呢?
java doc 的说明中如下说明:URI 是统一资源标识符,而 URL 是统一资源定位符。因此,笼统地说,每个 URL 都是 URI,但不一定每个 URI 都是 URL。这是因为 URI 还包括一个子类,即统一资源名称 (URN),它命名资源但不指定如何定位资源。

也就是说,我们通过 get 方法提交的参数实际上都是通过 uri 提交的,都由这个参数管理,如果没有设定这个参数,则 tomcat 将使用默认的 iso8859-1 对客户端的内容进行编码。

useBodyEncodingForURI 使用与 Body 一样的编码来处理 URI, 这个设定是为了与 tomcat4保持兼容,原来在 tomcat4 和 tomcat5 中队参数的处理是不一样的,在 tomcat4 中 get 与 post 的编码是一样的,所以只要在过滤器中通过 request.setCharacterEncoding 设定一次就可以解决 get 与 post 的问题。然而,在 tomcat5 中,get 与 post 的处理是分开进行的,对 get 的处理通过 前面的 URIEncoding 进行处理,对 post 的内容依然通过 request.setCharacterEncoding 处理,为了保持兼容,就有了这个设定。

将 useBodyEncodingForURI 设定为真后,就可以通过 request.setCharacterEncoding 直接解决 get 和 post 中的乱码问题。

这样,我们可以通过在 server.xml 中设定 URIEncoding 来解决 get 方法中的参数问题,使用过滤器来解决 post 方法中的问题。

或者也可以通过在 server.xml 中设定 useBodyEncodingForURI 为 true ,配合过滤器来解决编码的问题。

在这里,我强烈建议在网站的创作过程中,全程使用 utf-8 编码来彻底解决乱码问题。

具体操作如下:
1、页面内容使用 utf-8 格式保存,在页面中加入 <mete http-equiv="contentType" content="textml;charst=utf-8">

2、服务器端的 server.xml 中设定 useBodyEncodingForURI = true

3、使用过滤器,过滤器设定编码为 utf-8

标签:多种,中文,编码,get,request,设定,乱码,过滤器,post
From: https://blog.51cto.com/u_16065168/6443266

相关文章

  • VS编译 error C2001: 常量中有换行符 中文无法通过编译
    VS编译errorC2001:常量中有换行符中文无法通过编译只有部分中文会提示,并且有时报错又时不错。2种解决方案:不用中文程序中添加system("chcp65001");使用UTF-8字符编码,且在高级保存选项中选择unicode(utf-8带签名)......
  • Window下ES启动控制台中文乱码问题
    找到es安装目录config下的jvm.options文件,在空白处加上这一行:-Dfile.encoding=GBK关闭ES,重新启动程序,中文显示正常......
  • PL/SQL 中文的查询条件查询不到数据
    1.有很多种方法可以查出oracleserver端的字符集,比较直观的查询方法是以下这种:selectuserenv('language')fromdual;2.添加系统变量NLS_LANGAMERICAN_AMERICA.AL32UTF83.cmd查看系统变量echo%NLS_LANG%4.重启pl/sql ......
  • Eclipse的Console如何实现中文输出(Eclipse Display Chinese)
    最近遇到Eclipse的Console中文输出乱码的问题,现象如下:在网上找到一些方法,一般均不好用,直到找到“如何在Eclipse控制台中显示汉字”,链接如下 https://www.likecs.com/show-204927969.html经测试,发现上述描述,选择UTF-8不太行,而选择GBK是可以的。 请老铁们自己试试。下图也......
  • Midjourney AI绘画中文教程详解(完整版)模型、命令、参数与各种高级用法
     我有一种预感,您一下子看不完这篇内容,您得【收藏】一下,以便下次接着看~~ MidjourneyAI绘画中文教程,Midjourney是一款2022年3月面世的AI绘画工具,创始人是DavidHolz。 只要输入想到的文字,就能通过人工智能产出相对应的图片,耗时只有大约一分钟,这个工具不仅能绘画,还能做海报,UI设......
  • Hive - 多种表类型的CURD测试
     关于torc、textfile、orc、es、hyperdrive表的CURD测试  TORC(支持事务的orc表)测试TORC(分区表)测试TEXTFILE表测试ORC表测试ES(ElasticSearch表)测试hyperdrive表测试    TORC(支持事务的orc表)测试--torc测试--=======CREATETABLEdefault.torc_test(......
  • vscode设置将英文界面设置为中文?
    如果您希望将VisualStudioCode(以下简称VSCode)的界面从英文设置为中文,可以按照以下步骤进行:打开VSCode编辑器,并进入“扩展”菜单。在搜索框内输入“Chinese(Simplified)LanguagePackforVisualStudioCode”,然后点击安装该扩展程序。安装完成后,它会提示需要重新加载编辑器......
  • Jmeter-将响应数据从unicode编码转为中文
    现象: 解决:1. 修改配置 sampleresult.default.encoding=UTF-8 2. 添加后置处理器: BeanShell后置处理程序  可以在测试计划或者线程组下面添加,这样就不用每个请求都添加了. 代码:Strings=newString(prev.getResponseData(),"UTF-8");......
  • Docker for Windows 中文文档(3)——Docker Settings
    Docker设置Docker运行时,显示Docker鲸鱼。默认情况下,Docker鲸鱼图标被放置在“通知”区域中。如果隐藏,单击任务栏上的向上箭头显示。提示:您可以将鲸鱼固定在通知框外面,使其始终在任务栏上可见。为此,拖放鲸鱼图标。或者,右键单击任务栏的空白部分,选择设置,然后通过任务栏设置为通知......
  • Get started with Docker 中文文档(2)——Part 2: Containers
    先决条件安装Docker1.13或更高版本。阅读第1部分的方向。让您的环境快速测试,以确保您全部设置:dockerrunhello-world介绍现在是开始构建Docker应用程序的时候了。我们将从这样一个应用程序的层次结构的底部开始,这是一个容器,我们在这个页面上介绍。在这个层次之上是一个服务,它......