1.情景展示

html文件已經(jīng)聲明字符集為UTF-8,但是瀏覽器訪問依舊亂碼。

標(biāo)題和頁面內(nèi)容都是亂碼,這是怎么回事?
2.原因分析
charset="UTF-8"是讓瀏覽器要用utf-8來解釋,而文檔的編碼格式,是保存時(shí)的選擇決定的。
也就是說:這個(gè)HTML文件保存時(shí)的字符集不是UTF-8!
所以,HTML的編碼格式不是utf-8卻讓瀏覽器以utf-8的格式進(jìn)行解析,自然會亂碼。
但是,事實(shí)果真如此嗎?
使用notepad++打開該文件,發(fā)現(xiàn)文檔的字符集就是:utf-8。

這是不是很奇怪?
3.解決方案
從網(wǎng)上看到,說是默認(rèn)編碼格式是ANSI,需要改成UTF-8,顯然,我的格式現(xiàn)在已經(jīng)是UTF-8了,為什么還是亂碼?
抱著死馬當(dāng)活馬醫(yī)的態(tài)度,選中文件--》打開方式選擇記事本--》文件另存為:(編碼格式已經(jīng)默認(rèn)為UTF-8了)

替換原文件。
這個(gè)時(shí)候,再用notepad++打開該文件,你會發(fā)現(xiàn)該文件編碼集已經(jīng)發(fā)生了改變:

編碼集由UTF-8改為UTF-8-BOM了。
這次再用瀏覽器訪問該網(wǎng)頁,中文顯示不再亂碼了。
4.效果展示

到這就結(jié)束了,怎么可能,程序員的探索精神哪里去了?
5.擴(kuò)展應(yīng)用
對于已經(jīng)熟練使用開發(fā)工具的人,誰也不會傻到將文檔的編碼集設(shè)置為ANSI的,指定文檔編碼集的工作已經(jīng)由開發(fā)工具替代了,我們只需要設(shè)置一下就好了。
那么,現(xiàn)在來探索一下,使用ANSI編碼的html文件,究竟能不能被瀏覽器正確解析。
第一步:在桌面新建一個(gè)文本文檔。
雙擊打開,手敲html模板:

保存之后,修改文件后綴名為html

使用瀏覽器打開,可以正常顯示,不會亂碼!

此時(shí)的文檔編碼為:ANSI,可以使用記事本重新打開該html文件--》文件--》另存為:

或者,直接使用notepad++打開該文件,右下角顯示的就是:該文件的編碼集。

這就可以證明,使用記事本創(chuàng)建的文件,默認(rèn)的編碼集是:ANSI。
第二步:添加uf-8聲明,告知瀏覽器以utf-8格式解析html內(nèi)容

再次打開瀏覽器,顯示已經(jīng)亂碼了。

這,才是網(wǎng)絡(luò)上流傳的由ANSI編碼引起亂碼的真相?。。?/p>
第三步:將該文件的字符集改為utf-8。
使用記事本打開該文件--》另存為--》字符集指定為UTF-8,保存,替換原文件

使用瀏覽器再次訪問,這就又可以顯示正常了。

此時(shí)顯示正常是因?yàn)椋何臋n編碼集為UTF-8,瀏覽器也以UTF-8的字符集來解析html文件。
此時(shí),再用notepad++打開,右下角的字符集也變成了:UTF-8-BOM。

第四步:得出結(jié)論。
使用Windows記事本新建的文件,默認(rèn)字符集是:ANSI,另存為UTF-8格式,其實(shí)際格式為帶有BOM的utf-8,并不是我們平常開發(fā)是指定的(真正意義上的)utf-8!
此時(shí),是不是完事了?沒有,繼續(xù)!
新的問題來了:為什么UTF-8-BOM,瀏覽器解析不亂碼,而UTF-8,瀏覽器解析就亂碼呢?
通過notepad++,將該文件的字符集改為無bom格式的utf-8,也就是真正的utf-8。

修改成功。

保存,再次使用瀏覽器打開該文件,你會發(fā)現(xiàn):仍然可以正常顯示。

是不是很奇怪?為了進(jìn)一步驗(yàn)證,我們這次再把剛開始的那個(gè)html文件由utf-8-bom改成utf-8試試!
結(jié)果還是不行,還是會亂碼!
?
結(jié)論:我這種情況,估計(jì)很少有人碰到,不管它了,就這吧。不過,可以肯定的是:
不管文檔的編碼集是UTF-8,還是UTF-8-BOM,都不影響瀏覽器以UTF-8字符集進(jìn)行正常解析中文!
還想繼續(xù)深入了解UTF-8與UTF-8(BOM)可以看這篇文章:UTF-8與UTF-8(BOM)區(qū)別和一些說明?
但是,至于為什么開頭的文件使用UTF-8為何會亂碼,無從得知!
補(bǔ)充:20191119
如果你使用的是jsp,一定要加上這段代碼:

否則jsp轉(zhuǎn)java的時(shí)候使用的字符集是iso-8859-1,servlet返回的html文件的字符集也是iso-8859-1,而不是utf-8。如下圖所示:

換句話說,雖然將jsp文件的字符集是utf-8,但是tomcat使用java編譯時(shí)使用的卻是iso-8859-1,所以最終響應(yīng)到瀏覽器的html的編碼集是iso-8859-1;
而我們實(shí)際開發(fā)的時(shí)候字符集是utf-8,所以當(dāng)頁面存在中文的時(shí)候就會出現(xiàn)亂碼問題。
寫在最后
哪位大佬如若發(fā)現(xiàn)文章存在紕漏之處或需要補(bǔ)充更多內(nèi)容,歡迎留言?。。?/p>
轉(zhuǎn)載至:https://www.cnblogs.com/Marydon20170307/p/11362559.html
該文章在 2025/8/21 17:15:42 編輯過