我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Java servlet使用PrintWriter时的编码与乱码怎么办

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Java servlet使用PrintWriter时的编码与乱码怎么办

这篇文章主要介绍Java servlet使用PrintWriter时的编码与乱码怎么办,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!

现在来说下 Java servlet 中使用字符流,也即是 PrintWriter 时的编码与乱码问题。

回顾字节流的情形

先回顾一下,在之前的字节流响应中,我们使用 String.getBytes 方法,然后总是显式传入编码的参数,使它与 meta 中或者 header 的声明一致。比如这样:

Java servlet使用PrintWriter时的编码与乱码怎么办

或者这样:

Java servlet使用PrintWriter时的编码与乱码怎么办

只要保持了一致,就不用担心发生乱码的问题。

使用 PrintWriter 字符流,缺省编码

现在假如使用 PrintWriter 来作为响应呢?比如这样:

Java servlet使用PrintWriter时的编码与乱码怎么办

代码中并没有显式传入什么编码的参数,不像 String.getBytes 那样。另一方面,我们知道,字符流最终还是要转换成字节流,可是它到底使用了什么编码呢?是不是 Charset.defaultCharset 中的值呢?

就以上述代码为例,假如现在在浏览器中查看,会发现结果是这样的:

Java servlet使用PrintWriter时的编码与乱码怎么办

可见 defaultCharset 缺省是 utf-8,前面说过,这其实来自于启动 tomcat server 时所传入的参数 –Dfile.encoding:

Java servlet使用PrintWriter时的编码与乱码怎么办

但汉字却没有正确输出,可见 PrintWriter 并没有采用这个缺省值。查看 header 中的响应:

Java servlet使用PrintWriter时的编码与乱码怎么办

也没有任何编码的指示。

虽然 meta 中声明是 utf-8,输出的缺省字符集的值也是 utf-8,可是从最终结果不难看出 PrintWriter 并没有采纳这个值来转换字节流。(实际上它根本不会试图去理解这个)。

看一看它的文档说明,会发现情况有点不一样:

Java servlet使用PrintWriter时的编码与乱码怎么办

原来没有指定时,PrintWriter 不是用 Charset.defaultCharset 中的值,而是用 response.getCharacterEncoding 方法中所返回的值,而没有指定的话,那个方法其实就返回一个缺省值:ISO-8859-1。

再看看 getCharacterEncoding 方法:

Java servlet使用PrintWriter时的编码与乱码怎么办

可以看到它的值又是来源于显式的 response.setCharacterEncoding 或 response.setContentType 方法,或者是隐式的 setLocale 方法。(显式的具有更高的优先级)假如没有,就用缺省的 ISO-8859-1。

它还提到 RFC 2047 标准 ,打开看看,是关于 MIME 中非 ASCII 文本的消息头扩展(MIME (Multipurpose Internet Mail Extensions) Part Three:  Message Header Extensions for Non-ASCII Text)的。文中有一处提到如果字符集编码缺失,推荐用 iso8859 系列:

Java servlet使用PrintWriter时的编码与乱码怎么办

注意这里没有明说是 iso-8859-1,它说的是 iso-8859-*,不过 servlet 最终采用的是 iso-8859-1.

所以现在清楚了,缺省用 iso-8859-1,可以用 getCharacterEncoding 得到它的值,不过 iso 不支持中文字符,所以响应流中不能出现中文:

Java servlet使用PrintWriter时的编码与乱码怎么办

结果是这样:

Java servlet使用PrintWriter时的编码与乱码怎么办

使用 PrintWriter 字符流,显式指定编码

按照前面说的,可以在 write 之前使用 setCharacterEncoding 等方法指定编码:

Java servlet使用PrintWriter时的编码与乱码怎么办

这样就 OK 了:

Java servlet使用PrintWriter时的编码与乱码怎么办

要注意,这种情况下,response header 中仍然没有 charset 信息,所以要在 meta 中指定。

也可以用 setContentType (或前面一直用的 setHeader,其实两者是等价的):

Java servlet使用PrintWriter时的编码与乱码怎么办

也能达成同样效果:

Java servlet使用PrintWriter时的编码与乱码怎么办

这种情况下,response header 中包含 charset 信息,所以前面的代码中可以省略在 meta 中的声明:

Java servlet使用PrintWriter时的编码与乱码怎么办

那么,现在我们明白了,PrintWriter 的缺省与普通字符流的缺省是不同的,机制有所差别。

使用普通字符流,缺省编码

当然如果你一定要用普通字符流,也是可以的,但最后需要主动 flush:

Java servlet使用PrintWriter时的编码与乱码怎么办

这时的缺省就是 Charset.defaultCharset 中的值了,这里把它拼在了 meta 和最终的输出中,响应也是正常的:

Java servlet使用PrintWriter时的编码与乱码怎么办

结果是 utf-8。跟前面所说的 tomcat server 启动时参数的值一致。

使用普通字符流,显式指定编码

如果不打算用缺省,那就直接指定:

Java servlet使用PrintWriter时的编码与乱码怎么办

结果同样是 OK 的:

Java servlet使用PrintWriter时的编码与乱码怎么办

当然,一般还是建议使用 PrintWriter 来输出,而即便你一定要用普通字符流,也最好不要用缺省。

以上是“Java servlet使用PrintWriter时的编码与乱码怎么办”这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注编程网行业资讯频道!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Java servlet使用PrintWriter时的编码与乱码怎么办

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Java servlet使用PrintWriter时的编码与乱码怎么办

这篇文章主要介绍Java servlet使用PrintWriter时的编码与乱码怎么办,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!现在来说下 Java servlet 中使用字符流,也即是 PrintWriter
2023-05-30

Dreamweaver编辑网页预览的时候显示乱码该怎么办

这篇文章主要介绍“Dreamweaver编辑网页预览的时候显示乱码该怎么办”,在日常操作中,相信很多人在Dreamweaver编辑网页预览的时候显示乱码该怎么办问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”D
2023-06-08

java中的unicode编码方式怎么使用

在Java中,可以使用\u后面跟着四个十六进制数字的方式表示Unicode编码的字符。例如,要表示字符'中'的Unicode编码为U+4E2D,可以使用\u4E2D来表示。以下是一个示例代码,演示了如何使用Unicode编码方式表示字符:`
2023-09-25

SecureCRT出现中文乱码怎么办?win10系统使用SecureCRT出现中文乱码的解决方法

很多用户在Windows10系统电脑中使用SecureCRT时,都会遇到中文乱码的情况,这是怎么回事呢?我们要如何操作呢?接下来,小编就为大家详细介绍wpythonin10下使用SecureCRT出现中文乱码的解决方法吧! 具体python
2023-05-22

使用java怎么获取字节码的编译版本

使用java怎么获取字节码的编译版本?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。示例代码package com.jinggujin.util;import java.io.D
2023-05-31

怎么使用IDEA查看java文件编译后的字节码内容

这篇文章主要介绍“怎么使用IDEA查看java文件编译后的字节码内容”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“怎么使用IDEA查看java文件编译后的字节码内容”文章能帮助大家解决问题。首先编写
2023-06-29

在linux下写的代码时用的是utf-8结果拿到XP下运行候所有的中文都成乱码该怎么办

本篇文章给大家分享的是有关在linux下写的代码时用的是utf-8结果拿到XP下运行候所有的中文都成乱码该怎么办,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。如果用editpl
2023-06-13

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录