setCharacterEncoding和setContentType有什么不同

news2024/10/7 2:23:24

如果仅仅从服务器的角度来看,这两个方法其实本质是一样的,以下内容是摘抄自oracle的官网:

Defines an object to assist a servlet in sending a response to the client. The servlet container creates a ServletResponse object and passes it as an argument to the servlet's service method.
To send binary data in a MIME body response, use the ServletOutputStream returned by getOutputStream(). To send character data, use the PrintWriter object returned by getWriter(). To mix binary and text data, for example, to create a multipart response, use a ServletOutputStream and manage the character sections manually.

The charset for the MIME body response can be specified explicitly using the setCharacterEncoding(java.lang.String) and setContentType(java.lang.String) methods, or implicitly using the setLocale(java.util.Locale) method. Explicit specifications take precedence over implicit specifications. If no charset is specified, ISO-8859-1 will be used. The setCharacterEncoding, setContentType, or setLocale method must be called before getWriter and before committing the response for the character encoding to be used.

从服务器端角度看,两个方法就是给服务器返回前端的内容进行编码设置。

但是,再次强调,内容是要在平台上展示的,而平台也是有自己的charset的。如果平台用来展示内容的charset与内容不符合时,出现的依然是乱码。

看例子:

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setCharacterEncoding("utf-8");
        ServletOutputStream stream = response.getOutputStream();
        stream.write("<h1>AC米兰足球队</h1>".getBytes("utf-8"));
        stream.close();
    }

 那根据前面的解释,这段代码就是从服务器发给客户端一个响应,响应的内容是用UTF8编码的字符串<h1>AC米兰足球队</h1>。

代码运行,通过chrome浏览器发起请求,访问/test得到的页面是:

用F12打开开发者工具,分别看一下网络的响应和预览:

 首先是响应中看到的内容:

 然后是预览中看到的内容:

 

 发现不同之处了吗?那么背后的原因呢?

说明浏览器收到了正经UTF8编码的内容,但是浏览器并没有得到任何提示或者要求用什么编码方式来呈现这段内容!所以浏览器使用的是默认编码方式。那么Windows系统下的中文Chrome默认的编码方式是什么?猜也猜到了:GBK。

通过Chrome的Charset插件,就可以证明这一点:

好了,那我们如何告知浏览器用什么编码集来呈现内容呢?只要在响应头中加入contentType,浏览器会遵照contentType的指示来使用编辑呈现内容。如何在响应头中加入contentType,当然就是使用setContentType喽。

修改上面Servlet的doGet方法:

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //response.setCharacterEncoding("utf-8");
        response.setContentType("text/html;charset=utf-8");
        ServletOutputStream stream = response.getOutputStream();
        stream.write("<h1>AC米兰足球队</h1>".getBytes("utf-8"));
        stream.close();
    }

这回使用了setContentType,用标准的MIME格式设置了服务器响应内容的字符集是UTF8,并且添加了响应头,告诉浏览器该使用什么编码集来显示内容:

 这一次浏览器遵守contentType的指示,知道了收到的内容格式是text/html,要使用utf8字符集进行显示。

---------------------------------------------------------------------------------------------------------------------------------

所以,对于服务端来说,setCharacterEncoding和setContentType这两个方法的作用是一样的,都是显示的为服务器响应内容指定一个编码方案。

但是对于浏览器来说,setContentType是会添加响应头的,会指导浏览器用正确的字符集来显示服务器的响应内容,而setCharacterEncoding做不到这一点。

不过,现在你知道了Chrome的默认字符集是GBK,所以你完全可以用setCharacterEncoding("GBK")用GBK作为服务器响应内容的编码方案,这样也可以正常显示中文:

 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setCharacterEncoding("GBK");
        //response.setContentType("text/html;charset=utf-8");
        ServletOutputStream stream = response.getOutputStream();
        stream.write("<h1>AC米兰足球队</h1>".getBytes("GBK"));
        stream.close();
    }

 

 相较于setContentType来说,这种设置方式就是“巧了”,浏览器的默认编码方案碰巧是服务器响应内容的编码方案。

---------------------------------------------------------------------------------------------------------------------------------

还有一种代码编写风格是同时使用setContentType和setCharacterEncoding方法。同时使用者两种方法的效果是:setCharacterEncoding会补充或覆盖setContentType的内容。

1.补充:

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setCharacterEncoding("gb2312");
        response.setContentType("text/html");
        ServletOutputStream stream = response.getOutputStream();
        stream.write("<h1>AC米兰足球队</h1>".getBytes("gb2312"));
        stream.close();
    }

setContentType提供的MIME只有类型没有编码方案,此时setCharacterEncoding的内容就称为了contentType中charset的内容。所以,浏览器收到的内容是有一个形如text/html;charset=gb2312这样的contentType响应头的。

 按照ContentType的指示,浏览器正确显示了服务器响应内容。

2.覆盖:

如果setContentType和setCharacterEncoding都设置了完整内容,那么setCharacterEncoding提供的编码方案将作为服务器内容的编码方案,但是浏览器会在收到响应内容的同时会收到由setContentType设置的请求头:

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setCharacterEncoding("gb2312");
        response.setContentType("text/html;charset=UTF-8");
        ServletOutputStream stream = response.getOutputStream();
        stream.write("<h1>AC米兰足球队</h1>".getBytes("gb2312"));
        stream.close();
    }

gb2312编码的内容,浏览器会使用请求头指示的UTF-8来显示,结果可想而知:

 --------------------------------------------------------------------------------------------------------------------------------

以上就是对setContentType和setCharacterEncoding方法的使用说明。显然,我个人更倾向于使用setContentType,同时兼顾了服务端内容编码和浏览器端解码的问题。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/52139.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

HITCTF2022-WEB2-easypop

WEB easypop 题目给了源码 <?php // php version 7.4.32 class a{protected $a1;private $a2;private $a3;public function __unset($unset) {$this->a2 [];if($this->a3){if($this->a1->{$unset} ! []){$this->a1->{$unset} $this->a2;}}}funct…

Python编程 顺序执行与程序的主入口

作者简介&#xff1a;一名在校计算机学生、每天分享Python的学习经验、和学习笔记。 座右铭&#xff1a;低头赶路&#xff0c;敬事如仪 个人主页&#xff1a;网络豆的主页​​​​​​ 目录 前言 一.顺序执行 1.顺序执行(了解) 2.程序主入口(熟悉) 前言 本章将会讲解P…

网络安全运维工程师(NISP-SO)需要掌握那些知识点

想要学习了解“网络安全运维工程师&#xff08;NSP-SO)”看这个12点就够了。从“掌握核心能力”到如何“应急响应”并提高安全运维的知识水平 第一阶段 先导基础知识内容 学生可掌握的核心能力 1、能够根据企业需求&#xff0c;搭建基于windows服务器的网站 2、能够根据企业…

二、CSS自制浏览器滑动条

一、滑动条 思路&#xff1a;首先我们需要想清楚&#xff0c;大体思路应该是把浏览器默认滑动条隐藏&#xff0c;然后自己手写一个好看的滑动条&#xff0c;主要是做出和浏览器滑动条一样的上下移动的效果出来。 解释&#xff1a;如下图所示&#xff0c;有一个盒子高度是100p…

【论文阅读笔记】A review of the deep learning methods for medical images super resolut

摘要 医疗图像中分辨率的限制来源于&#xff1a;图像采集次数的限制&#xff0c;由于硬件限制导致的低辐射&#xff08;Low irradiation&#xff09;等。 这篇综述应该比较基础&#xff0c;从深度学习 -> 超分网络架构 -> 再到医疗图像超分问题的介绍。对于医疗方向的介绍…

[附源码]JAVA毕业设计高校信息资源共享平台(系统+LW)

[附源码]JAVA毕业设计高校信息资源共享平台&#xff08;系统LW&#xff09; 目运行 环境项配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目…

3.13 小红书笔记怎样带话题,才能增加曝光?【玩赚小红书】

虽然很多博主都知道在笔记内容最后要带上一个相关话题&#xff0c;但却很少人知道带什么样的话题&#xff0c;如何找到官方话题或热门话题来提高笔记内容的曝光。这一篇文章黄宇风就来讲讲&#xff0c;小红书笔记该如何带话题。 ​ ​ 1、挖掘小红书笔记热门话题 笔记带话题主…

命令行下编译与运行简单的OC程序

学习OC的语法建议还是用普通的编辑器写OC代码&#xff0c;然后在终端命令行下编译与运行。那我们来看一下是如何在命令行下编译一个OC源文件&#xff0c;以及运行编译后的可执行文件的 开发环境 操作系统&#xff1a;macOS Big Sur 终端&#xff1a;iTerm2 Build 3.4.8 clong…

Linux基础知识与实操-篇五:bash使用进阶

通过上篇 篇四:初识bash与配置 的学习&#xff0c;已经基本认识了Linux下bash工具的使用和配置&#xff0c;下面将讲解过多关于bash在其他地方的使用。 终端机的环境设置 stty -a 命令可以得到 目前环境中 所有的 按键列表&#xff0c;其中 ^ 表示的是 ctrl 按键&#xff0c;…

原来电商企业也能运用模型规划设计营销活动

营销推广是电商重要的运营组成。电商平台要发起一场综合性的推广活动&#xff0c;需要明确参与活动的商品范围、促销价格、推广渠道以及如何触达到消费者等。很多营销推广活动规则复杂且不断变化&#xff0c;就需要使用模型来设计&#xff0c;例如邀人砍一刀的“免费提现”、多…

[附源码]Python计算机毕业设计Django高校学生宿舍管理系统

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

【人工智能】知识图谱

文章目录一、知识图谱的概况二、知识图谱的基本概念三、知识图谱构建技术四、知识图谱主要应用四、知识图谱主要应用一、知识图谱的概况 知识&#xff08;Knowledge&#xff09;&#xff1a;合理性&#xff08;Justified&#xff09;、真实性&#xff08;True&#xff09;、被…

B轮融资背后:未势能源在万亿“长坡”上,铺出三重“厚雪”

今年以来&#xff0c;氢能源行业爆发出强劲的资本热潮。 川财证券分析称&#xff0c;我国氢能领域已完成35起投融资事件&#xff0c;总金额超过63亿元。另外&#xff0c;在A股市场&#xff0c;今年以来就有东华能源、粤水电等上市公司宣布涉足氢能。11月30日&#xff0c;专注氢…

汇川伺服电机位置控制模式QT程序Demo实现

0.实现效果 1.工程文件 #------------------------------------------------- # # Project created by QtCreator 2022-11-30T09:37:26 # #-------------------------------------------------QT core gui QT serialportgreaterThan(QT_MAJOR_VERSION, 4): QT …

JAVA实现数组模拟队列

队列本身是有序列表&#xff0c;若使用数组的结构来存储队列的数据&#xff0c;则队列数组的声明如下图, 其中 maxSize 是该队列的最大容量。 因为队列的输出、输入是分别从前后端来处理&#xff0c;因此需要两个变量 front及 rear分别记录队列前后端的下标&#xff0c;front 会…

RepVGG论文理解与代码分析

最近&#xff0c;看到很多轻量化工作是基于RepVGG改进而来&#xff0c;决定重新回顾一下RepVGG&#xff0c;并在此记录一些理解与心得。 论文地址&#xff1a;https://arxiv.org/abs/2101.03697 Introduction RepVGG通过结构重参数化思想&#xff0c;让训练网络的多路结构(多…

[附源码]JAVA毕业设计-高中辅助教学系统-(系统+LW)

[附源码]JAVA毕业设计-高中辅助教学系统-&#xff08;系统LW&#xff09; 目运行 环境项配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技…

[附源码]Python计算机毕业设计Django电商小程序

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

「湖仓一体」释放全量数据价值!巨杉数据库亮相2022沙丘大会

近日&#xff0c;由数字化研究与知识服务平台沙丘社区主办的2022沙丘大会成功举办&#xff0c;巨杉数据库受邀出席大会&#xff0c;并在湖仓一体专场进行《湖仓一体释放全量数据价值》的主题演讲。 近日&#xff0c;由数字化研究与知识服务平台沙丘社区主办的2022沙丘大会以线上…

低代码开发平台助力生产管理:采购成本管理的优化

采购是企业经营活动中的重要环节&#xff0c;它处于企业生产经营活动的最前端&#xff0c;同时也是成本费用中占较大比重的环节。采购成本主要是指企业在生产过程中用于采购产品及服务等交易活动所产生的一系列支出&#xff0c;包括物资的购买价格、税费、运输费等&#xff0c;…