html声明charset="utf-8"后,浏览器访问中文依旧乱码(绝对有效)

摘要:
1.场景html文件已声明字符集为UTF-8,保存html文件时的字符集不是UTF-8!HTML编码格式不是utf-8,但浏览器将其解析为utf-8格式。默认编码格式为ANSI,它将替换原始文件。您会发现文件编码集已更改:没有人愚蠢到将文档编码集设置为ANSI,并将文件后缀更改为html以使用浏览器打开它。
 
 

1.情景展示

html声明charset="utf-8"后,浏览器访问中文依旧乱码(绝对有效)第1张

  html文件已经声明字符集为UTF-8,但是浏览器访问依旧乱码。

html声明charset="utf-8"后,浏览器访问中文依旧乱码(绝对有效)第2张

  标题和页面内容都是乱码,这是怎么回事?

2.原因分析

   charset="UTF-8"是让浏览器要用utf-8来解释,而文档的编码格式,是保存时的选择决定的。

  也就是说:这个HTML文件保存时的字符集不是UTF-8!

  所以,HTML的编码格式不是utf-8却让浏览器以utf-8的格式进行解析,自然会乱码。

  但是,事实果真如此吗?

  使用notepad++打开该文件,发现文档的字符集就是:utf-8。

html声明charset="utf-8"后,浏览器访问中文依旧乱码(绝对有效)第3张

  这是不是很奇怪?

3.解决方案

  从网上看到,说是默认编码格式是ANSI,需要改成UTF-8,显然,我的格式现在已经是UTF-8了,为什么还是乱码?

  抱着死马当活马医的态度,选中文件--》打开方式选择记事本--》文件另存为:(编码格式已经默认为UTF-8了)

html声明charset="utf-8"后,浏览器访问中文依旧乱码(绝对有效)第4张

  替换原文件。

  这个时候,再用notepad++打开该文件,你会发现该文件编码集已经发生了改变:

 html声明charset="utf-8"后,浏览器访问中文依旧乱码(绝对有效)第5张

  编码集由UTF-8改为UTF-8-BOM了。

  这次再用浏览器访问该网页,中文显示不再乱码了。

4.效果展示

html声明charset="utf-8"后,浏览器访问中文依旧乱码(绝对有效)第6张

  到这就结束了,怎么可能,程序员的探索精神哪里去了?

5.扩展应用

  对于已经熟练使用开发工具的人,谁也不会傻到将文档的编码集设置为ANSI的,指定文档编码集的工作已经由开发工具替代了,我们只需要设置一下就好了。

  那么,现在来探索一下,使用ANSI编码的html文件,究竟能不能被浏览器正确解析。

  第一步:在桌面新建一个文本文档。

  双击打开,手敲html模板:

html声明charset="utf-8"后,浏览器访问中文依旧乱码(绝对有效)第7张

  保存之后,修改文件后缀名为html

html声明charset="utf-8"后,浏览器访问中文依旧乱码(绝对有效)第8张

  使用浏览器打开,可以正常显示,不会乱码!

html声明charset="utf-8"后,浏览器访问中文依旧乱码(绝对有效)第9张

  此时的文档编码为:ANSI,可以使用记事本重新打开该html文件--》文件--》另存为:

html声明charset="utf-8"后,浏览器访问中文依旧乱码(绝对有效)第10张

  或者,直接使用notepad++打开该文件,右下角显示的就是:该文件的编码集。

html声明charset="utf-8"后,浏览器访问中文依旧乱码(绝对有效)第11张

  这就可以证明,使用记事本创建的文件,默认的编码集是:ANSI。

  第二步:添加uf-8声明,告知浏览器以utf-8格式解析html内容

html声明charset="utf-8"后,浏览器访问中文依旧乱码(绝对有效)第12张

  再次打开浏览器,显示已经乱码了。

html声明charset="utf-8"后,浏览器访问中文依旧乱码(绝对有效)第13张

  这,才是网络上流传的由ANSI编码引起乱码的真相!!!

  第三步:将该文件的字符集改为utf-8。

  使用记事本打开该文件--》另存为--》字符集指定为UTF-8,保存,替换原文件

html声明charset="utf-8"后,浏览器访问中文依旧乱码(绝对有效)第14张

  使用浏览器再次访问,这就又可以显示正常了。

html声明charset="utf-8"后,浏览器访问中文依旧乱码(绝对有效)第15张

  此时显示正常是因为:文档编码集为UTF-8,浏览器也以UTF-8的字符集来解析html文件。

  此时,再用notepad++打开,右下角的字符集也变成了:UTF-8-BOM。

html声明charset="utf-8"后,浏览器访问中文依旧乱码(绝对有效)第16张

  第四步:得出结论。

  使用Windows记事本新建的文件,默认字符集是:ANSI,另存为UTF-8格式,其实际格式为带有BOM的utf-8,并不是我们平常开发是指定的(真正意义上的)utf-8!

  此时,是不是完事了?没有,继续!

  新的问题来了:为什么UTF-8-BOM,浏览器解析不乱码,而UTF-8,浏览器解析就乱码呢?

  通过notepad++,将该文件的字符集改为无bom格式的utf-8,也就是真正的utf-8。

html声明charset="utf-8"后,浏览器访问中文依旧乱码(绝对有效)第17张

  修改成功。

html声明charset="utf-8"后,浏览器访问中文依旧乱码(绝对有效)第18张

  保存,再次使用浏览器打开该文件,你会发现:仍然可以正常显示。

html声明charset="utf-8"后,浏览器访问中文依旧乱码(绝对有效)第19张

  是不是很奇怪?为了进一步验证,我们这次再把刚开始的那个html文件由utf-8-bom改成utf-8试试!

  结果还是不行,还是会乱码!

html声明charset="utf-8"后,浏览器访问中文依旧乱码(绝对有效)第20张

  结论:我这种情况,估计很少有人碰到,不管它了,就这吧。不过,可以肯定的是:

不管文档的编码集是UTF-8,还是UTF-8-BOM,都不影响浏览器以UTF-8字符集进行正常解析中文!

但是,至于为什么开头的文件使用UTF-8为何会乱码,无从得知!

  补充:20191119

  如果你使用的是jsp,一定要加上这段代码:

<%-- 告知tomcat以utf-8的字符集生成html文件 --%>
<%@ page language="java"  pageEncoding="UTF-8"%>

  否则jsp转java的时候使用的字符集是iso-8859-1,servlet返回的html文件的字符集也是iso-8859-1,而不是utf-8。如下图所示:

html声明charset="utf-8"后,浏览器访问中文依旧乱码(绝对有效)第21张

  换句话说,虽然将jsp文件的字符集是utf-8,但是tomcat使用java编译时使用的却是iso-8859-1,所以最终响应到浏览器的html的编码集是iso-8859-1;

  而我们实际开发的时候字符集是utf-8,所以当页面存在中文的时候就会出现乱码问题。

写在最后

  哪位大佬如若发现文章存在纰漏之处或需要补充更多内容,欢迎留言!!!

 相关推荐:

 

免责声明:文章转载自《html声明charset="utf-8"后,浏览器访问中文依旧乱码(绝对有效)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Linux下的CPU利用率计算原理详解技术学习网站下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

前端 WebUploader 分块上传

这里只写后端的代码,基本的思想就是,前端将文件分片,然后每次访问上传接口的时候,向后端传入参数:当前为第几块文件,和分片总数 下面直接贴代码吧,一些难懂的我大部分都加上注释了: 上传文件实体类: 看得出来,实体类中已经有很多我们需要的功能了,还有实用的属性。如MD5秒传的信息。 public class FileInf {      public File...

[代码审计]XiaoCms(后台任意文件上传至getshell,任意目录删除,会话固定漏洞)

 0x00 前言 这段时间就一直在搞代码审计了。针对自己的审计方法做一下总结,记录一下步骤。 审计没他,基础要牢,思路要清晰,姿势要多且正。 下面是自己审计的步骤,正在逐步调整,寻求效率最高。 0x01 关于 XiaoCms XiaoCms 企业建站版基于 PHP+Mysql 架构 是一款小巧、灵活、简单、易用的轻量级 cms。能满足各种企业站 博客 等...

mac 下终端访问文件出现“Permission Denied”解决方案

mac 下终端访问文件出现“Permission Denied”解决方案: 一个文件有3种权限,读、写、可执行,你这个文件没有可执行权限,需要加上可执行权限。 1. 终端下先 cd到该文件的目录下 2. 执行命令 chmod a+x ./文件名 这样就可以打开该文件了...

Git 常用命令以及Centos7部署Gitlab、Gogs

1.git介绍2.git常用命令3.搭建Gogs   git介绍Git -- 分布式版本控制系统. 分布式AND集中式? (来自于廖雪峰老师Git介绍) Git是分布式版本控制系统,集中式和分布式版本控制系统有什么区别呢? 先说集中式版本控制系统,版本库是集中存放在中央服务器的,而干活的时候,用的都是自己的电脑,所以要先从中央服务器取得最新的版本,然后开...

图片上传——用一般处理程序实现

.Net 中如何实现图片上传 1、表单元素使用文件选择框<input  type ="file " />控件2、表单设置enctype="multipart /form-data ",本质上是设置浏览器提交表单的数据时,使用随机分隔符来分 割不同控件的数据,而且数据的组织形势由name=value 换成了数据头和数据体的方式 二、服务器端1、服...

DLL发布 matlab代码发布

https://blog.csdn.net/alansss/article/details/81320548 最近需要将写好的matlab代码转成基于OpenCV的代码,然后再封装成dll进行发布。一开始直接看基于OpenCV的dll生成,但是都不太成功,故而先试试没有OpenCV的dll生成。 主要参考了以下两个网页:  VS2013生成dll及动态调用...