Java 修改编码格式的几种方式
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java 修改编码格式的几种方式相关的知识,希望对你有一定的参考价值。
主要分response的字节字符输出流和request接受中文参数doGet(),doPost()的设置四种.以及从服务器下载文件到浏览器的编码问题.都是我学习java时总结的,希望能帮到你.
response的字节输出流:
// 设置浏览器默认打开的时候采用的字符集编码
response.setHeader("Content-Type", "text/html;charset=UTF-8");
// 设置中文转成字节数组的时候取出的编码
response.getOutputStream().write("如果不设置编码,这里就是乱码".getBytes("UTF-8"));
response的字符输出流:
//设置浏览器默认打开的时候采用的字符集编码,response的字符流的缓冲区的编码.
response.setContentType("text/html;charset=UTF-8");
response.getWriter().println("中文");
request的doGet()编码解决:
String name = new String(request.getParameter("name").getBytes("ISO-8859-1"),"UTF-8");
System.out.println("GET方式:"+name);
request的doPost()编码解决:
request.setCharacterEncoding("UTF-8");
String name = request.getParameter("name");
System.out.println("POST方式:"+name);
下载文件时浏览器编码问题:
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
// 1.接收参数
String filename = new String(request.getParameter("filename").getBytes("ISO-8859-1"),"UTF-8");
System.out.println(filename);
// 2.完成文件下载:
// 2.1设置Content-Type头(获取文件的mime类型)
String type = this.getServletContext().getMimeType(filename);
//设置文件的mime类型
response.setHeader("Content-Type", type);
// 2.3web项目文件的绝对路径
String realPath = this.getServletContext().getRealPath("/download/"+filename);
// 获得浏览器的类型处理中文文件的乱码问题.(User-Agent:服务器收到客户端版本之类的一些信息)
String agent = request.getHeader("User-Agent");
System.out.println(agent);
if(agent.contains("Firefox"))
filename = base64EncodeFileName(filename);
else
//IE谷歌编码
filename = URLEncoder.encode(filename,"UTF-8");
// 2.2设置Content-Disposition头(固定写法,让浏览器必须下载,不能直接打开)
response.setHeader("Content-Disposition", "attachment;filename="+filename);
//获得文件
InputStream is = new FileInputStream(realPath);
// 获得response指定的方法获取输出流:如果用其他流是直接拷贝而不是下载
OutputStream os = response.getOutputStream();
int len = 0;
byte[] b = new byte[1024];
while((len = is.read(b))!= -1)
os.write(b, 0, len);
//响应流可以不关,在服务器做出相应后服务器会自动把response获得的流关闭
is.close();
//火狐
public static String base64EncodeFileName(String fileName)
BASE64Encoder base64Encoder = new BASE64Encoder();
try
return "=?UTF-8?B?"
+ new String(base64Encoder.encode(fileName
.getBytes("UTF-8"))) + "?=";
catch (UnsupportedEncodingException e)
e.printStackTrace();
throw new RuntimeException(e);
参考技术A 以一个编码格式读取,然后以另一个格式写入
Servlet的几种(out)输出流编码设置
Servlet的几种输出流编码设置
在很多场合会发现我们输出的中文是乱码,这主要可能有两方面的原因:
一个是浏览器的解析方式,另一个是我们服务器端返回数据的方式。只要我们保证浏览器的解析方式和我们回显的数据的编码格式是一致的,基本上乱码问题就可以得到解决。大多数数情况下,浏览器的默认编码方式是utf-8,因此我们只要设置服务器返回的数据的编码方式也是utf-8即可。
1、response.setCharacterEncoding(“UTF-8”);
- 第一种方法只能用来设置out输出流中所采用的编码,但是它的优先权最高,可以覆盖后面两种方法中的设置;
2、response.setContentType(“text/html;charset=UTF-8”);
-
第二中方法可以设置out输出流中字符的编码方式,也可以设置浏览器接收到这些字符后以什么编码方式来解码,它的优先权低于第一种方法,但高于第三种方法
-
这种方法通知response以UTF-8输出和浏览器以UTF-8打开。即等价于
-
response.setHeader(“content-type”, “text/html;charset=UTF-8”); (通知浏览器以utf-8解析) 和response.setCharacterEncoding(“UTF-8”);
-
注意第二句句需要写在PrintWriter out = response.getWriter();的前面,如果拿到字符流后再设置编码是没有用的。
3、response.setLocale(new java.util.Locale(“zh”,“CN”));
- 第三种方法只能用来设置out输出流中字符的编码方式,但是它的优先权最低,在已经使用前两种方法中的一个设置了编码方式以后,它就被覆盖而不起作用了。
4.response.setHeader(“content-type”, “text/html;charset=UTF-8”);
- 通知浏览器以utf-8解析
- response.setHeader 设置请求头
以上是关于Java 修改编码格式的几种方式的主要内容,如果未能解决你的问题,请参考以下文章