最近在看Java web中中文编码问题,特此记录下。

本文将会介绍常见编码方式和Java web中遇到中文乱码问题的常见解决方法:

一、常见编码方式:

1、ASCII 码

众所周知,这是最简单的编码。它总共可以表示128个字符,0~31是控制字符如换行、回车、删

除等,32~126是打印字符,可以通过键盘输入并且能够显示出来的。

2、ISO-8859-1

它是基于ASCII码基础上扩展的,它总共能表示256个字符,涵盖了大多数西欧语言字符。详见

ISO-8859-1 编码    该编码不支持中文,举个中文编码栗子:

字符串“I am 君山”用 ISO-8859-1 编码,下面是编码结果:

由于ISO-8859-1 是单字节编码且不支持中文,直接将中文字符转成‘3f’, 3f也就是常见的"?"字符

3、GB2312

它是双字节编码,共包含6763个汉字。

4、GBK

汉字内码扩展规范,是基于GB2312上拓展的,加入了更多的汉字,能表示21003个汉字。它的编码

是和GB2312兼容的。也就是说用GB2312编码的汉字可以用GBK来解码,并且不会乱码。倒过来就不完

全可以了,因为GB2312描述的汉字比GBK少。

5、UTF-16

UTF-16是基于Unicode上定义的, 用两个字节来表示Unicode的转换格式,它采用定长的表示方法,

即不能什么字符都可以用两个字节表示。两个字节是16个bit,所以就做UTF-16。(Unicode 囊括了世界

上所有语言,所有语言均可通过Unicode来相互翻译,详解Unicode 编码)

6、UTF-8

由于UTF-16统一采用两个字节来表示一个字符, 有很多字符用一个字节表示即可。所以存储空间放

大了一倍,还会增加网络传输的流量,所以推出了UTF-8。 UTF-8采用了一种变长技术,每个编码区域有

不同的字码长度。

通过上面介绍和对比,对于中文字符的处理我想UTF-8是最理想的中文编码。

二、常见乱码问题分析

1、中文变成看不懂的字符

如果一串中文字符变成了一串看不懂的字符如:"Ì Ô £ ¡Î Ò Ï²»¶ £ ¡",这种情况通常是编码

字符集与解码时所用的字符集不一致所造成的。比如使用GBK编码,如果使用ISO-8859-1解码

的话结果就是这样。

2、一个汉字变成了一个问号

如果编码和解码的字符集都是一致的,那么可以确定该字符编码不支持中文,例如:ISO-8859-1

3、一个汉字变成了两个问号

中文经过多次编码且其中有一次编码或者解码使用了不支持中文的字符集

三、常见案例分析(tomct+google)

1、参数传输乱码

背景:从jsp中传参数(包括中文)请求后台数据,在后台获取到的请求参数乱码。

1.1 前端编码设置,先讲解下jsp中编码的配置:

a、其中contentType中charset用来设置服务器发送给客户端时的内容编码;pageEncoding 用

来设置JSP源文件本身和响应正文中的字符编码。通俗的说pageEncoding是jsp文件本身的编码,如果

pageEncoding设置为ISO-8859-1,则jsp页面中不能保存中文字符,会自动提示你是否要设置为UTF-8.

b、jsp文件编码字符集默认为ISO-8859-1, JSP源文件字符集时,优先级为pageEncoding>

contentType。如果都没有设置,默认ISO-8859-1。

c、设置响应输出的字符集时,优先级为contentType>pageEncoding。如果都没有设置,默认

ISO-8859-1。

综上所述,解决该问题乱码的第一步要设置jsp中的编码,最好统一为UTF-8。

exmaple(乱码示例):

页面效果如下:

1.2 后端编码设置

a、首先要设置tomcat编码,其中要了解两个参数(conf/server.xml):URIEncoding 和

useBodyEncodingForURI,可以查看官方文档说明:

1)URIEncoding是对所有GET方式的请求的数据进行统一的重新编码,默认编码为

ISO-8859-1(针对URI上的请求参数)

2)useBodyEncodingForURI:此设置仅适用于请求的查询字符串(针对请求体中内容)。

与URIEncoding不同,它不影响请求URI的路径部分。如果不知道请求字符编码(浏览器不提供,

并且SetCharacterEncodingFilter不设置或使用Request.setCharacterEncoding方法的类

似过滤器),默认编码始终为“ISO-8859-1”。URIEncoding设置对此默认值没有影响。

该参数为false。通俗的说:

true表示get和post的编码保持一致,post方式的编码是什么,get方式的编码就是什么。

false表示get和post的字符编码各自设置,互相没有关系。

example1(只设置URIEncoding):

server.xml

redirectPort="443" URIEncoding="UTF-8" />

controller:

@RequestMapping(value = "/testURI", method=RequestMethod.POST)

@ResponseBodypublicString testURI(HttpServletRequest request){

String username= request.getParameter("username");

String nickname= request.getParameter("nickname");

System.out.println("姓名:" + username + ", 昵称:" +nickname);return "姓名:" + username + ", 性别:" +nickname;

}

jsp:

输出结果:     姓名:张三, 昵称:èå¼ ä¸

从结果中可以看出, URIEncoding只对URI中的参数进行编码。

example2:只修改controller中代码,就都会显示正常

@RequestMapping(value = "/testURI", method=RequestMethod.POST)

@ResponseBodypublic String testURI(HttpServletRequest request) throwsUnsupportedEncodingException{

request.setCharacterEncoding("UTF-8");

String username= request.getParameter("username");

String nickname= request.getParameter("nickname");

System.out.println("姓名:" + username + ", 昵称:" +nickname);return "姓名:" + username + ", 性别:" +nickname;

}

其实第二种做法并不是很方便,一般通过设置URIEncoding+encodingFilter即可解决。

example3(通常做法):

web.xml代码如下,其余跟example1一样即可。

encodingFilter

org.springframework.web.filter.CharacterEncodingFilter

encoding

UTF-8

forceEncoding

true

encodingFilter

/*

example4:

@RequestMapping(value = "/testURI", method=RequestMethod.POST)

@ResponseBody

public String testURI(HttpServletRequest request) throwsUnsupportedEncodingException{

request.setCharacterEncoding("UTF-8");

String username = request.getParameter("username");

String nickname = request.getParameter("nickname");

System.out.println("姓名:" + username + ", 昵称:" +nickname);

return "姓名:" + username + ", 性别:" +nickname;

}

如果只设置URIEncoding=ISO-8859-1,request.setCharacterEncoding("UTF-8");只会

对请求体中的参数进行编码,所以username是乱码的。

example5: 在example4的基础上设置useBodyEncodingForURI="true"

设置useBodyEncodingForURI=true时,就会将请求参数和请求体中的参数根据

request.setCharacterEncoding或者contentType中的字符集编码。

本文先记录至此,参考文献有《深入分析Java web解析》《tomcat docs》

java 问号乱码_Java web中常见编码乱码问题(一)相关推荐

  1. java 登录下线_java web中Listener的实现(实现用户在线统计数量和强制用户下线)...

    一.实现的具体功能 (1)实现用户在线数量的统计,并显示在页面上. (2)实现强制用户下线的功能.创建一个超链接,用于实现强制用户下线的功能. (3)监听session的创建和销毁. 二.代码实现 ( ...

  2. java cookie 永久_java web中cookie的永久创建与撤销

    一.首先是创建cookie 当在数据库中查找知道所输入的用户名和密码正确之后,就开始创建: String cb=request.getParameter("cb");//cb就是登 ...

  3. java web中的中文乱码问题和解决方法

    开发过程中可能会遇到页面中的中文显示为乱码无法正常查看,出现乱码的原因很多,以下举例并提供解决方法 一.HTML页面设置的编码与页面文件格式的编码不一致 检查方法:1.查看文件的编码格式 用记事本打开 ...

  4. java通过struts实现web中的文件下载

    上一篇已经记录了 web中的文件上传功能 java通过struts实现web中的文件上传 本篇记录下载功能 定义一个Action类,FileDownload.java package com.stru ...

  5. Java开发人员在编程中常见的雷!

    身为一名Java从业人员,其职场生涯就是一边踩"坑",一边上升的过程.这个过程中不仅要学会修改无数bug,也要学会越过很多"坑".今天,千锋老师为大家分享一些J ...

  6. 一些Java开发人员在编程中常见的雷!

    身为一名Java从业人员,其职场生涯就是一边踩"坑",一边上升的过程.这个过程中不仅要学会修改无数bug,也要学会越过很多"坑".今天,小千为大家分享一些Jav ...

  7. 如何解决oracle中文乱码问题,oracle中解决中文乱码问题

    中文乱码问题解决 1.查看服务器端编码 select userenv('language') from dual; 查到结果是: USERENV('LANGUAGE') --------------- ...

  8. java工程编辑器中文乱码_Java Web开发项目中中文乱码解决方法汇总

    Java Web项目中,解决中文乱码方法总结如下 第一种情况:调用jsp页面中文显示乱码问题描述:通过浏览器调用jsp页面,在浏览器中显示的中文内容出现乱码. 解决方法:首先确认本jsp在编辑器中保存 ...

  9. java输出的汉字变成乱码_Java Web项目中解决中文乱码方法总结

    一.了解常识: 1.UTF-8国际编码,GBK中文编码.GBK包含GB2312,即如果通过GB2312编码后可以通过GBK解码,反之可能不成立; 2.web tomcat:默认是ISO8859-1,不 ...

最新文章

  1. 谷歌新模型刷新ImageNet纪录,第一作者是上海交大毕业生谢其哲
  2. springside / springside4—CRUD页面教程
  3. 程序人生系列之新闻发布系统 在网站部署经验分享
  4. 关于项目过程能力基线的几个讨论
  5. Some functions worth remembered in C Library (Updating)
  6. 方程组的几何解释 [MIT线代第一课pdf下载]
  7. wcf会话、实例化、并发
  8. Python代码刷博客访问量
  9. 剖析云计算和大数据落地后x86服务器的业务痛点
  10. python怎么设置背景音乐_怎么设置背景音乐?
  11. android studio 融云,融云 SDK 集成详解 – Android Studio
  12. Python爬取图片
  13. 银河麒麟V10(Kylin Linux V10)安装ElasticSearch
  14. 2cm有多长实物图_两厘米(2cm有多长实物图)
  15. 电脑桌面云便签怎么设置开启邮箱提醒待办事项?
  16. 浏览器被360劫持怎么办
  17. 沈定刚,雷柏英,李超 | Cell Press Live:人工智能在医学影像中的应用
  18. 手机寂静岭 java 攻略_寂静岭PT最终房间进入及通关攻略
  19. 说说汉古中医对新型冠状病毒感染的认识和防治
  20. win10的开机启动文件夹

热门文章

  1. python程序怎么保存到u盘_Python 骚操作,自动拷贝U盘
  2. 智能多轮对话机器人案例剖析(附源码)-张子良-专题视频课程
  3. 拼多多2019秋招编程题——选靓号
  4. 解决Jmeter5.2.1插件管理器Plugins Manager下载插件异常问题
  5. 电脑计算机打开没有权限管理,电脑没有权限打不开软件怎么办?
  6. C语言顺序结构程序设计——对调数字and判断三角形
  7. xxljob任务实例
  8. jdk8 list 反转_YSL反转巴黎香水真假鉴别
  9. QQ2 微信红包java
  10. 基于GWO灰狼优化的生产线工件工序调度优化matlab仿真,仿真输出优化收敛曲线和工序调度甘特图