Servlet向客户端发送中文数据的编码情况
(更多内容请关注本人微信订阅号:it_pupil)

本文讲述服务端servlet向客户端浏览器发送中文数据的编码情况,需要抓住下面几点:
输出流发送数据,必须是以字节形式传输的。也就是说,如果你在服务端定义一个字符串,那么servlet要先编码成字节数组,再发送到客户端。
客户端浏览器在收到字节码数据时,需要将其解码成字符串显示出来。
在服务端,如果你使用的是字节流,那么只需要注意两点:
拿到字符串,以特定形式编码成字节数组(如UTF-8)。(字节数组是你人工转换的)
告诉浏览器,以相同方式解码显示(UTF-8)。
如果你使用的是字符流,那么需要注意三点:
字符流其实就是你传给它的是字符,它自己内部还是会转换成字节的。
拿到字符串,告诉服务端,发送时以特定方式编码成字节数组(如UTF-8)。(字节数组是字符流内部转换的)
告诉浏览器,以相同方式解码显示(UTF-8)。
就上面提出的几点,有三种实现方案保证不乱码(也是乱码的解决思路):
方案一,字节流:
方案二,字符流:
方案三,还是字符流:
方案三其实可以像下面模拟一下编解码的过程(toHex方法是把字节数组以16进制形式输出):
所以,方案三的关键之处在于,一开始用UTF-8编码,最后用UTF-8解码,这是本质。
虽然ISO-8859-1是单字节编码,但是,一开始用UTF-8编码后,你用ISO-8859-1解码,它会一个字节一个字节去解开,而UTF-8表示的汉字,一个汉字是三个字节,当然会乱码。
但是乱码不要紧啊,这个乱码只是个中间过程,不需要显示出来。紧接着用ISO-8859-1再编码,那么,编码出的字节是跟UTF-8编码的字节是相同的。
如此,最后再用UTF-8去解码,完美!
本文是关于编码分析的第5篇,原文地址:
http://mp.weixin.qq.com/s?__biz=MzIyNzUzNjQ3MA==&tempkey=37C%2F%2BA4Bi9W%2F7a0wo%2B56WiBFhphFwjbCfb6TgA3OcQ4v4JbKjTBmxOQLMoZldKoCJeAi%2BhxmRuBUwSzp7yjZCA2k5X%2BXxzpE3hD%2BaLWechfiCfr797hJOnJt29Rqr9eM5KF3ZKZOmQ%2FeJGYzG8vXRQ%3D%3D&#rd
更多内容请关注相关订阅号查看。
Servlet向客户端发送中文数据的编码情况的更多相关文章
- response小结(一)——用response向客户端输出中文数据(乱码问题分析)
Web服务器收到客户端的http请求,会针对每一次请求,分别创建一个用于代表请求的request对象,和代表响应的response对象.request和response对象既然代表请求和响应,那我们要 ...
- SpringMVC客户端发送json数据时报400错误
当测试客户端发送json数据给服务器时,找不到响应路径? 原来是参数类型不符,即使是json也要考虑参数的个数和类型 解决:将age请求参数由"udf"改为"3" ...
- socket小程序写一个客户端,实现给服务端发送hello World字符串,将客户端发送的数据变成大写后返回
写一个客户端,实现给服务端发送hello World字符串,将客户端发送的数据变成大写后返回 本机id是192.168.xx.xy 服务端 import socket soc = socket.soc ...
- udp回显客户端发送的数据
这里让客户端给服务端发送的数据被服务端自动发回来 客户端: import socket client_socket = socket.socket(socket.AF_INET, socket.SOC ...
- tcp回显客户端发送的数据
客户端: import socket tcp_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) tcp_socket.connect ...
- (九)springmvc之json的数据请求(客户端发送json数据到服务端)
index.jsp <%@ page language="java" contentType="text/html; charset=UTF-8" pag ...
- 使用SQLSERVER 2008 R2 配置邮件客户端发送DB数据流程要领
设置邮件 QQ邮箱貌似不太行,建议用企业邮箱或者其他邮箱作为发件箱 新建一个邮件发件箱账号,具体邮件服务器按照各自邮件配置,是否使用ssl,自便 下一步,下一步,配置成功 use msdb Go DE ...
- Python3学习之路~8.2 socket简单实例 实现ssh 发送大量数据
实例1: 利用socket模拟客户端和服务器端各自收发一次数据: #Author:Zheng Na # 客户端 import socket # 声明socket类型,同时生成socket连接对象 cl ...
- 【Java框架型项目从入门到装逼】第五节 - 在Servlet中接收和返回数据
在上一节的程序中,我们可以看到HttpServletRequest, HttpServletResponse这两个对象.可以说,这是JavaWeb中至关重要的两个对象.接下来,我们来做一个简短的说明: ...
随机推荐
- Python学习笔记之条件、循环和其他语句
一.函数导入 1.为模块提供别名 >>> import math as foobar #设置math 别名为foobar >>> foobar.sqrt(4) 显示 ...
- 图表,列表在同一DIV里切换显示()
JS: function changeTable(){ $(".countTable").slideDown(); $(".countChart").css(& ...
- 直接在 CSS 中引用 FONTAWESOME 图标(附码表)
直接在 CSS 中引用 FONTAWESOME 图标(附码表) 因此我们如果不想用 Fontawesome 提供的类,只想在 css 里面引用图标的话,可以这样子,请自行脑补: .icon:befor ...
- fiddler监听127.0.0.1或localhost
localhost/127.0.0.1的请求不会通过任何代理发送,fiddler也就无法截获. 解决方案 1,用 http://localhost. (locahost紧跟一个点号)2,用 http: ...
- JS对数字进行货币格式化并且保留两位小数点,小数用0补全
/** * 将数值四舍五入(保留2位小数)后格式化成金额形式 * * @param num 数值(Number或者String) * @return 金额格式的字符串,如'1,234,567.45' ...
- kotlin 练习
Kotlin 定义函数的一些语法 fun main(args:Array<String>):Unit { val x:() -> Unit = { println("hel ...
- Angular js 之动态传数据到下一个页面和动态通过ng-click进入不同的页面
+关于Angular js中一些千篇一律的后台获取数据 首先在services.js里面把服务写好 然后在controller里面把数据给打印出来 (首先需要把数据注入) +关于Angular js中 ...
- Bootstrap <基础二十三>页面标题(Page Header)
页面标题(Page Header)是个不错的功能,它会在网页标题四周添加适当的间距.当一个网页中有多个标题且每个标题之间需要添加一定的间距时,页面标题这个功能就显得特别有用.如需使用页面标题(Page ...
- anguar.js tutorial demo
http://docs.angularjs.cn/tutorial angular 入门demo : PhoneCat Tutorial App 别人的DEMO(官方版):http://angular ...
- 查询java 类加载的路径
在Spring 3.x企业应用开发实战中看到一个能经常用到的jsp,记录下,查看类的加载路径, 在jar包冲突引起的奇葩问题时很好用.使用方法 srcAdd.jsp?className=java.ne ...