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中至关重要的两个对象.接下来,我们来做一个简短的说明: ...
随机推荐
- biweb后台添加上传下载功能
1.数据库对应表添加字段 file varchar(100) 2.对应的后台 模块名/admin/addinfo.php里添加如下代码: //文件上传 if ((($_FILES[&quo ...
- js中正则表达式 ---- 现成
1 . 校验密码强度 密码的强度必须是包含大小写字母和数字的组合,不能使用特殊字符,长度在8-10之间. ^(?=.*\\d)(?=.*[a-z])(?=.*[A-Z]).{8,10}$ 2. 校验中 ...
- guava学习--AsyncFunction
AsyncFuntion接口与之前学习吃的使用Function和Functions进行对象转换有很密切的联系,AsyncFuction接口是Function接口的异步表现,AsyncFuction和F ...
- C——没有bool的C语言?
bool static my_var_initialized = false; 偶然写出了这样一句C代码,环境是visual studio 2012,工程是Compile as C的,竟然报了好几个错 ...
- supervisor centos安装
一.安装配置supervisor 1.安装python自动化工具 #yum install python-setuptools 2.#easy_install supervisor安装super ...
- lamp遇到问题
1.配置好apache和虚拟host,显示无权, 将网站目录更新755,还是不行,最后selinux: 1.设置下面即可: chcon -R -h -t httpd_sys_content_t /ho ...
- C# 4.0 新特性dynamic (待学习)
随便翻看了一下dynamic,在网上拷贝了一个例子,先贴出来等有空了再慢慢消化 static void Main(string[] args) { dynamic d = new MyDynamicO ...
- 驱动插ring3线程执行代码
近日有在写一个小东西 需要在内核态中运行一个WIN32程序 之前提到的插入APC可以满足部分要求 但是一到WIN7 x86平台下就崩溃了WIN7下只能插入第三方的进程 一插入系统进程就崩溃,但是这样满 ...
- Bootstrap <基础三十一>插件概览
在前面布局组件中所讨论到的组件仅仅是个开始.Bootstrap 自带 12 种 jQuery 插件,扩展了功能,可以给站点添加更多的互动.即使不是一名高级的 JavaScript 开发人员,也可以着手 ...
- 理解js中__proto__和prototype的区别和关系
首先,要明确几个点:1.在JS里,万物皆对象.方法(Function)是对象,方法的原型(Function.prototype)是对象.因此,它们都会具有对象共有的特点.即:对象具有属性__proto ...