主页 > 站长 > 教育 > 正文

各种中文乱码解决办法

发布时间:

  在编程的时候会遇到各种中文乱码,这里进行统计以便以后查阅
 
  1、前端页面元素中文乱码
 
  <metahttp-equiv="Content-Type"content="text/html;charset=GBK"/>
 
  会出现下面乱码
 
  页面上的元素也就是html内的元素,是中文的会出现乱码,而从后台获取的中文不会出现乱码。
 
  解决方法:页面上设置编码方式为UTF-8
 
  <metahttp-equiv="Content-Type"content="text/html;charset=UTF-8"/>
 
  2、URL传参、get方式传参出现中文乱码,如下
 
  出现这种情况,要先确定参数在前台页面上不是乱码的,可以alert()一下,看参数是否乱码
 
  解决办法1:
 
  对于以get方式传输的数据,request默认使用ISO8859-1这个字符编码来接收数据,客户端以UTF-8的编码传输数据到服务器端,而服务器端的request对象使用的是ISO8859-1这个字符编码来接收数据,服务器和客户端沟通的编码不一致因此才会产生中文乱码的。
 
  解决办法:在接收到数据后,先获取request对象以ISO8859-1字符编码接收到的原始数据的字节数组,然后通过字节数组以指定的编码构建字符串,解决乱码问题。
 
  publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)
 
  throwsServletException,IOException{
 
  Stringid=request.getParameter("id");
 
  id=newString(name.getBytes("ISO8859-1"),"UTF-8");
 
  }
 
  解决方法2:
 
  修改tomcat服务器的编码方式,可以在server.xml里面设置
 
  <ConnectorconnectionTimeout="20000"port="8080"protocol="HTTP/1.1"redirectPort="8443"URIEncoding="UTF-8"/>
 
  设置成红字部分,但是有时也是不可用的,因为即使这里设置的是UTF-8但是其他地方设置成其他编码方式会覆盖掉这个设置,仔细检查各个地方的编码。
 
  比如SpringBoot的application.properties配置文件里设置成server.tomcat.uri-encoding=GBK就会覆盖掉tomcat自己的设置,我这里是打个比方,因为SpringBoot是内置Tomcat服务器的。
 
  解决办法3:中文参数进行编码处理
 
  ?id="+encodeURI(encodeURI("中文参数"));
 
  后台:
 
  Stringname=request.getParameter("name");
 
  Stringstr=URLDecoder.decode(name,"UTF-8");
 
  3、POST方式出现中文乱码
 
  原因:因为服务器和客户端沟通的编码不一致造成的,因此解决的办法是:在客户端和服务器之间设置一个统一的编码,之后就按照此编码进行数据的传输和接收。
 
  解决方法:由于客户端是以UTF-8字符编码将表单数据传输到服务器端的,因此服务器也需要设置以UTF-8字符编码进行接收
 
  1、后台代码
 
  publicvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)
 
  throwsServletException,IOException{
 
  request.setCharacterEncoding("UTF-8");//注意要在getParameter之前设置
 
  Stringid=request.getParameter("id");
 
  }
 
  2、如果使用的是框架的话,可以统一设置字符过滤器,这里以SpringMVC为例:
 
  复制代码
 
  <filter>
 
  <description>字符集过滤器</description>
 
  <filter-name>encodingFilter</filter-name>
 
  <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
 
  <init-param>
 
  <description>字符集编码</description>
 
  <param-name>encoding</param-name>
 
  <param-value>UTF-8</param-value>
 
  </init-param>
 
  </filter>
 
  <filter-mapping>
 
  <filter-name>encodingFilter</filter-name>
 
  <url-pattern>/*</url-pattern>
 
  </filter-mapping>
 
  复制代码
 
  3、SpringBoot这样设置:创建一个类继承WebMvcConfigurerAdapter
 
  复制代码
 
  publicclassMyWebMvcConfigurerAdapterextendsWebMvcConfigurerAdapter{
 
  @Bean
 
  publicHttpMessageConverter<String>responseBodyConverter(){
 
  StringHttpMessageConverterconverter=newStringHttpMessageConverter(
 
  Charset.forName("UTF-8"));
 
  returnconverter;
 
  }
 
  @Override
 
  publicvoidconfigureMessageConverters(
 
  List<HttpMessageConverter<?>>converters){
 
  super.configureMessageConverters(converters);
 
  converters.add(responseBodyConverter());
 
  }
 
  @Override
 
  publicvoidconfigureContentNegotiation(
 
  ContentNegotiationConfigurerconfigurer){
 
  configurer.favorPathExtension(false);
 
  }
 
  }
 
  复制代码
 
  4、使用注解@RequestBody导致接收的中文参数乱码,可以参考我的这篇博客(比较详细)
阅读全文
▋最新热点