黑马day03 字符流乱码解决方法以及原理分析

1.字符流的乱码

response.getWriter().write("中国");这行代码,首先会把中国写入到缓冲区,然后使用老外喜欢用的iso-8859-1进行编码。

然后浏览器使用本地编码表进行解码。因此会产生乱码。

package com.itheima;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class Demo7Servlet extends HttpServlet {
	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		response.getWriter().write("中国");
	}
	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		doGet(request, response);
	}
}

运行结果:

然后解决方式:就是告知服务器使用gbk进行编码:response.setCharacterEncoding("gbk");

package com.itheima;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class Demo7Servlet extends HttpServlet {
	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		//告知服务器使用gbk进行编码
		response.setCharacterEncoding("gbk");
		response.getWriter().write("中国");
	}
	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		doGet(request, response);
	}
}

运行结果:

2.如果告知服务器使用utf-8进行编码,但是浏览器会使用默认编码gbk,所以为了防止乱码,因此需要告知浏览器使用utf-8进行解码

package com.itheima;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class Demo7Servlet extends HttpServlet {
	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		//告知服务器使用gbk进行编码
		response.setCharacterEncoding("utf-8");
		//告知浏览器使用utf-8进行解码
		response.setHeader("Content-Type", "text/html;charset=utf-8");
		response.getWriter().write("中国");
	}
	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		doGet(request, response);
	}
}

运行结果:

3.sun公司为了方便使用所以使用response.setContentType("text/html;charset=utf-8");告知浏览器使用utf-8进行解码,但是底层可以预先知道服务器使用什么编码进行编码。

因此这句话相当于即告知服务器使用ut8-8编码,同时也告知浏览器使用utf-8进行解码。这句话代替了这两句话的作用:

//告知服务器使用gbk进行编码

response.setCharacterEncoding("utf-8");

//告知浏览器使用utf-8进行解码

response.setHeader("Content-Type", "text/html;charset=utf-8");

response.getWriter().write("中国");

package com.itheima;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class Demo7Servlet extends HttpServlet {
	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		//即告知服务器使用ut8-8编码,同时也告知浏览器使用utf-8进行解码。
		response.setContentType("text/html;charset=utf-8");
		response.getWriter().write("中国");
	}
	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		doGet(request, response);
	}
}

运行结果:

时间: 2024-08-14 05:37:33

黑马day03 字符流乱码解决方法以及原理分析的相关文章

hashmap冲突的解决方法以及原理分析:

在Java编程语言中,最基本的结构就是两种,一种是数组,一种是模拟指针(引用),所有的数据结构都可以用这两个基本结构构造,HashMap也一样.当程序试图将多个 key-value 放入 HashMap 中时,以如下代码片段为例: HashMap<String,Object> m=new HashMap<String,Object>(); m.put("a", "rrr1"); m.put("b", "tt9&q

mysql导入导出数据中文乱码解决方法小结

inux系统中 linux默认的是utf8编码,而windows是gbk编码,所以会出现上面的乱码问题. 解决mysql导入导出数据乱码问题 首先要做的是要确定你导出数据的编码格式,使用mysqldump的时候需要加上--default-character-set=utf8, 例如下面的代码: 复制代码 代码如下: mysqldump -uroot -p --default-character-set=utf8 dbname tablename > bak.sql 那么导入数据的时候也要使用--

PHP json_encode中文乱码解决方法

<?php /** * [PHP json_encode中文乱码解决方法] * 这里说的"中文乱码"其实不是不是真的乱码,而是在最后的json结果中显示下面的字串: * {"name":"\u4e2d\u6587\u5b57\u7b26\u4e32″,"value":"test"} * * [解决办法] * 在使用json_encode之前把字符用函数urlencode()处理一下,然后再json_encode

jsp页面保存到数据库有乱码解决方法

第一种: 在页面前加上 <%@ page language="java" contentType="text/html;charset=gbk" errorPage=""%> <%request.setCharacterEncoding("GBK");%> 第一行说明你的页面用的是中文编码 第二行声明你的页面传值也用中文编码 第二种 tomcat4.x支持中文传码,但5.x不支持,如果用5.0以上的版本

VIM显示utf-8文档乱码解决方法

1.相关基础知识介绍 在Vim中,有四个与编码有关的选项,它们是:fileencodings.fileencoding.encoding和termencoding.在实际使用中,任何一个选项出现错误,都会导致出现乱码.因此,每一个Vim用户都应该明确这四个选项的含义.下面,我们详细介绍一下这四个选项的含义和作用. (1)encoding encoding是Vim内部使用的字符编码方式.当我们设置了encoding之后,Vim内部所有的buffer.寄存器.脚本中的字符串等,全都使用这个编码.Vi

gvim的菜单乱码解决方法

gvim的菜单乱码解决方法: (乱码是由于系统内码不兼容导致,系统内码包括gb2312 gb18030 utf-8 utf-16[unicode]等) 生成文件 ~/.gvimrc 并添加如下语句:set encoding=chineseset langmenu=zh_CN.GBKset imcmdlineset guifont="Serif 14"source $VIMRUNTIME/delmenu.vimsource $VIMRUNTIME/menu.vim 保存后即可解决乱码问题

MySql数据库乱码解决方法

MySql数据库乱码解决方法 解决乱码问题一个原则:存取系统使用一致的编码规则. 多使用mysql的原生命令行,这样才能做更多的事情. ? 第一步: 确认应用系统需要使用的编码 java的默认编码是跟随系统的,有的说是默认UNICode,在java中可以使用 String defaultCharsetName=Charset.defaultCharset().displayName();显示编码. 第二步: 确认并设置MySql的数据库的编码 1. 显示编码,简单的方法命令是:status; 或

json 解析乱码解决方法

1. 字符编码的的规律: 字符串的在存入txt文档文档有自身的编码方式,如utf-8,ansi等,但当 存入txt文档时,其编码方式就会和txt文档本身的编码方式保持一致. 比如字符之前的编码方式为ansi,txt文档的编码方式为utf-8,则存入的字符编码方式也会 变为utf-8编码方式.  当从txt文档读出该字符串时,其编码方式也应该是 utf-8. 2. 当前json解析乱码的解决方式 当前json数据的传输方式分为两种: 1). 通信放直接将自身拿到的字符串传输给另一端,在这个过程,无

[转]mysql导入导出数据中文乱码解决方法小结

本文章总结了mysql导入导出数据中文乱码解决方法,出现中文乱码一般情况是导入导入时编码的设置问题,我们只要把编码调整一致即可解决此方法,下面是搜索到的一些方法总结,方便需要的朋友. linux系统中 linux默认的是utf8编码,而windows是gbk编码,所以会出现上面的乱码问题. 解决mysql导入导出数据乱码问题 首先要做的是要确定你导出数据的编码格式,使用mysqldump的时候需要加上--default-character-set=utf8, 例如下面的代码: 代码如下: mys