首页 > 编程语言 >java web乱码问题

java web乱码问题

时间:2023-05-08 14:32:10浏览次数:28  
标签:web Java encoding 字符集 GBK 乱码 服务器 java


在javaweb项目中引起乱码的几个地方

1.tomcat配置文件server.xml

 

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

2.在web.xml配置拦截器

 

<!-- 字符集编码 -->
<filter>
<filter-name>encodingFilter</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>encodingFilter</filter-name>
<url-pattern>*.*</url-pattern>
</filter-mapping>

3.通过post提交表单信息

4.JSP页面中注意几个地方

 

<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<script type="text/javascript" charset="utf-8">

 

通过以上几个地方的修改,基本上能解决从页面到服务器的乱码问题

 

2.从服务器到客户端的乱码

数据库编码

在java代码中使用中文,最好使用JDK自带的转码工具native2ascii进行转码

 

 

 

 

问题:            项目在本机开发编译打包后发布到法国的服务器,代码中的中文全部乱码,就算是最简单的代码System.out.println("中文"),打印出来的也是乱码。

代码在本地的服务器测试都正常。

法国服务器的环境:window 2003 中文版。

解决:

在网友imasmallbird的指引下,发现是2个服务器的file.encoding的不同,本地服务器是GBK,而法国服务器是Cp1252,所以会产生乱码。

把法国服务器的区域设置改成中国后,file.encoding就变成GBK,这样可以解决这个问题,但因为很多原因不能直接改区域设置,比如改了区域设置后时间就不是法国时间。

目前解决办法如下:
1. 本地编译打包不用变,本地编译采用的是GBK编译的(默认采用系统字符集编译)

2. 在法国服务器的tomcat上加上JAVA的启动参数 -Dfile.encoding=GBK

重启tomcat,一切正常了。

解决了该问题后,顺便找了些JAVA的中文乱码的资料看了下,简单的总结下:

从Java 源代码到得到正确的结果,要经过 “Java 源代码-> Java 字节码-> 虚拟机->操作系统->显示设备”的过程。在上述过程中的每一步骤,我们都必须正确地处理中文的编码,才能够使最终显示正确的结果。

"Java 源代码-> Java 字节码":该阶段就是调用javac 进行编译的阶段,javac默认采用系统字符集,比如我们本地机器急就是GBK,如果想用其他的编码,比如UTF-8,可以加上 -encoding UTF-8

"Java 字节码-> 虚拟机->操作系统" :该阶段首先需要JRE或者JDK支持多语言(下载JRE的时候会让你选择英文版还是多语言版),然后就是虚拟机启动的时候使用什么字符集,默认也是采用 当前系统的字符集,如需要修改字符集,加上JAVA的启动参数,-Dfile.encoding=GBK

"操作系统->显示设备":该阶段主要就是需要操作系统支持显示中文就可以,就是安装了中文字体。

看到这里后重新看我们的乱码问题,我们在本地编译(Java 源代码-> Java 字节码 阶段)默认采用了GBK字符集,而"Java 字节码-> 虚拟机->操作系统" 阶段是在法国服务器上进行,也是采用了默认的字符集,但这里的默认字符集确实Cp1252,因字符集不一致,所以就会乱码。





System.getProperty("file.encoding")   得到当前系统字符集
content.getBytes(System.getProperty("file.encoding")),"GBK") 通过当前字符集转码

 

注意:org.springframework.web.filter.CharacterEncodingFilter,spring MVC中,使用上面的过滤器可以处理乱码问题无论是get还是post提交。

网上说:自己写的Filter的方法只适合于post的提交方式,对于get的提交方式不起作用,有待验证

 

标签:web,Java,encoding,字符集,GBK,乱码,服务器,java
From: https://blog.51cto.com/u_16087105/6254285

相关文章

  • 31基于java的旅游信息系统设计与实现
    本章节来给大家介绍一个基于java的旅游信息系统设计与实现系统概要旅游产业的日新月异影响着城市,村镇旅游产业的发展变化。网络、电子科技的迅猛前进同样牵动着旅游产业的快速成长。随着人们消费理念的不断发展变化,越来越多的人开始注意精神文明的追求,而不仅仅只是在意物质消......
  • WEB中间件常见漏洞总结
    WEB中间件常见漏洞总结什么是WEB中间件是一类提供系统软件和应用软件之间的连接,便于软件各部件之间的沟通的软件,应用软件可以借助中间件在不同的技术架构之间共享信息和资源。中间件位于客户机服务器的操作系统之上,管理着计算资源和网络通信。中间件=平台+通信一、IIS中间件1......
  • JavaScript: XMLHTTPRequest
     XMLHttpRequest(javascript.info)<body><script>//CreateanewXMLHTTPRequestobjectletxhr=newXMLHttpRequest()xhr.timeout=5000//timeoutinmsleturl=newURL('https://cursive.winch.io/......
  • Java - JVM
    JVM的位置JVM的体系结构      JVM的位置 JVM的体系结构 ......
  • java--Servlet以及Mvc的实现
    ServletServlet的生命周期Servlet的生命周期可以分为四个步骤:实例化。当Web容器(如Tomcat)启动时,会首先加载Servlet类,并创建Servlet实例。这一过程通常在应用程序启动时完成。初始化。接着容器会调用Servlet实例的init()方法来进行初始化操作。在这个方法中,通......
  • java泛型'T'与'?'基本知识
    从事了几年的开发工作,一直都是在有道云或者百度网盘上记录日常工作中的一些问题和经验,难以分享知识。这是第一次发博客随笔,以便后期与喜欢技术的大家一起进步;结论:'T'指的是某一类具体的对象,'?'可以表示成占位符,表明多种数据类型;示例:可以看到show1方法中我们使用了T,大家都知道......
  • Java泛型
    泛型使用泛型的本质是参数化类型1、List<T>{}publicclassHashSet<E>{}T和E必须是引用类型不能是基本类型2、使用List<Integer>list=newArrayList<Integer>();//后面可以直接缺省java编译器会帮我们自动推断List<Integer>list=newArrayList<>();3、如果不写......
  • Java 几种任务调度的实现方法与比较
    几种任务调度的Java实现方法与比较综观目前的Web应用,多数应用都具备任务调度的功能。本文由浅入深介绍了几种任务调度的Java实现方法,包括Timer,Scheduler,Quartz以及JCronTab,并对其优缺点进行比较,目的在于给需要开发任务调度的程序员提供有价值的参考。 任务调度是指......
  • java链表的疑惑
    head.next=tail; tail=newListNode();为什么head.next不等于tail在cpp里面head->next=tail;tail=newListNode();这时head->next==tail.这是因为head->next存放的是tail的地址,而java中head.next=tail; tail=newListNode();head.next存放的是tail的之前......
  • java: 错误: 无效的源发行版:17
    最近想在本地新建maven项目写写demo的,但是运行时提示java:错误:无效的源发行版:17错误。在这里记录一下,方便后面查看。1、修改IDEA设置JDK版本File-->Settings-->Build,Execution,Deployment-->Compiler-->JavaCompilerProjectStructure查看这两个设置......