最新文章專題視頻專題問(wèn)答1問(wèn)答10問(wèn)答100問(wèn)答1000問(wèn)答2000關(guān)鍵字專題1關(guān)鍵字專題50關(guān)鍵字專題500關(guān)鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關(guān)鍵字專題關(guān)鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
問(wèn)答文章1 問(wèn)答文章501 問(wèn)答文章1001 問(wèn)答文章1501 問(wèn)答文章2001 問(wèn)答文章2501 問(wèn)答文章3001 問(wèn)答文章3501 問(wèn)答文章4001 問(wèn)答文章4501 問(wèn)答文章5001 問(wèn)答文章5501 問(wèn)答文章6001 問(wèn)答文章6501 問(wèn)答文章7001 問(wèn)答文章7501 問(wèn)答文章8001 問(wèn)答文章8501 問(wèn)答文章9001 問(wèn)答文章9501
當(dāng)前位置: 首頁(yè) - 科技 - 知識(shí)百科 - 正文

造成網(wǎng)頁(yè)亂碼的根本性原因是什么

來(lái)源:懂視網(wǎng) 責(zé)編:小采 時(shí)間:2020-11-27 15:28:27
文檔

造成網(wǎng)頁(yè)亂碼的根本性原因是什么

造成網(wǎng)頁(yè)亂碼的根本性原因是什么:先看段代碼:<!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>網(wǎng)頁(yè)編碼</title&g
推薦度:
導(dǎo)讀造成網(wǎng)頁(yè)亂碼的根本性原因是什么:先看段代碼:<!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>網(wǎng)頁(yè)編碼</title&g
先看段代碼:

<!DOCTYPE HTML>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>網(wǎng)頁(yè)編碼</title>
</head>
<body>
</body>
</html>

HTML代碼中的<meta http-equiv="Content-Type" content="text/html; charset=utf-8"> 指定了網(wǎng)頁(yè)的編碼為utf-8。
網(wǎng)頁(yè)編碼涉及的知識(shí)點(diǎn)比較多,總的說(shuō)來(lái)它也是一個(gè)歷史遺留問(wèn)題。
第一臺(tái)計(jì)算機(jī)(ENIAC)于1946年2月誕生于美國(guó),當(dāng)時(shí)美國(guó)只考慮自己使用,并在計(jì)算機(jī)誕生后的幾年里制定了一套ASCII碼標(biāo)準(zhǔn)(American Standard Code for Information Interchange,美國(guó)信息交換標(biāo)準(zhǔn)代碼),它是基于拉丁字母的一套電腦編碼系統(tǒng),主要用于顯示現(xiàn)代英語(yǔ)和其他西歐語(yǔ)言。
ASCII碼使用8位二進(jìn)制數(shù)組合來(lái)表示256種可能的字符(2的8次方=256),包含了大小寫字母,數(shù)字0到9,標(biāo)點(diǎn)符號(hào),以及在美式英語(yǔ)中使用的特殊控制字符。一個(gè)字符占1個(gè)字節(jié)。ASCII碼表部分編碼如下:

HTML的轉(zhuǎn)義符(字符實(shí)體),比如符號(hào)“<”的轉(zhuǎn)義符為“<”或“<”,其中的數(shù)字編號(hào)“60”即是ASCII碼表的第60序號(hào)。類似的,大寫字母“K”也可以轉(zhuǎn)義為“K”。
我們使用轉(zhuǎn)義符做個(gè)試驗(yàn):

美國(guó)制定ASCII碼的意思是:ASCII碼可以滿足在計(jì)算機(jī)領(lǐng)域所有字符和表示上的需要。不過(guò)這只是美國(guó)自己的意思,畢竟所有的英文單詞都可以拆分來(lái)自26個(gè)英文字母,ASCII碼表能表達(dá)256個(gè)字符,確實(shí)足夠美國(guó)使用。
后來(lái)世界各地也都開(kāi)始使用計(jì)算機(jī),很多國(guó)家的語(yǔ)言文字并不是英文,這些國(guó)家的文字都沒(méi)被包含在ASCII碼表里。以我們中國(guó)為例,漢字近10萬(wàn)個(gè),根本無(wú)法排進(jìn)ASCII碼表。于是我們國(guó)家對(duì)ASCII碼表進(jìn)行拓展并形成自己的的一套標(biāo)準(zhǔn),在標(biāo)準(zhǔn)中一個(gè)漢字占2個(gè)字節(jié),新的碼表可以表達(dá)65536個(gè)漢字。但一開(kāi)始并沒(méi)有將碼表全部填充使用完,只收錄了常用的6000多個(gè)漢字、英文及其它符號(hào),這套標(biāo)準(zhǔn)稱為GB2312(信息交換用漢字編碼字符集,GB是“國(guó)家標(biāo)準(zhǔn)”的簡(jiǎn)化詞“國(guó)標(biāo)”的拼音首字母縮寫,2312是國(guó)標(biāo)序號(hào))。后來(lái)又制定了一套收錄更多漢字的標(biāo)準(zhǔn)(收錄的漢字有2萬(wàn)多個(gè)),稱為GBK(漢字編碼擴(kuò)展規(guī)范,K是“擴(kuò)”的拼音首字母)。
在GB2312或GBK里,許多標(biāo)點(diǎn)符號(hào)都使用2個(gè)字節(jié)進(jìn)行了重新編碼,這類占2個(gè)字節(jié)的標(biāo)點(diǎn)符號(hào)稱為“全角”字符(“全角”也稱“全形”或“全寬”或“全碼”),原來(lái)ASCII碼表中占1個(gè)字節(jié)的標(biāo)點(diǎn)符號(hào)則稱為“半角”字符(“半角”也稱“半形”或“半寬”或“半碼”)。全角的逗號(hào)、括號(hào)、句號(hào)等與半角是不一樣的:

在中文輸入法下,默認(rèn)的標(biāo)點(diǎn)符號(hào)是全角字符;在英文輸入法下,標(biāo)點(diǎn)符號(hào)則是半角字符。
我們接著講故事:隨著使用計(jì)算機(jī)的國(guó)家越來(lái)越多,各個(gè)國(guó)家制定自己的計(jì)算機(jī)編碼標(biāo)準(zhǔn)的情況也越來(lái)越多,導(dǎo)致的結(jié)果是:各國(guó)計(jì)算機(jī)的編碼互不支持、認(rèn)識(shí)。比如在美國(guó)的計(jì)算機(jī)里要顯示漢字,則必須安裝漢字系統(tǒng)才可以,否則中文文件在美國(guó)系統(tǒng)的計(jì)算機(jī)中打開(kāi)便是亂碼。
就這樣,在這個(gè)時(shí)期催生出了一個(gè)叫ISO的國(guó)際組織(International Organization for Standardization,國(guó)際標(biāo)準(zhǔn)化組織),著手解決各國(guó)的編碼問(wèn)題。ISO統(tǒng)一制作了一個(gè)稱為UNICODE(統(tǒng)一碼、萬(wàn)國(guó)碼、單一碼,Universal Multiple-Octet Coded Character Set,又簡(jiǎn)稱為UCS)的編碼方案,用于收錄地球上所有文字和符號(hào)。UNICODE字符分為17組編排,每組編排稱為平面(Plane),每個(gè)平面擁有65536個(gè)碼位,共計(jì)可以收錄1114112個(gè)字符(111萬(wàn)個(gè)字符,足夠大的容量)。UNICODE編碼統(tǒng)一一個(gè)字符占2個(gè)字節(jié)。
但UNICODE在很長(zhǎng)一段時(shí)間內(nèi)無(wú)法推廣,直到互聯(lián)網(wǎng)的出現(xiàn),數(shù)據(jù)的傳輸與交換使各國(guó)之間的編碼進(jìn)行統(tǒng)一化成為迫切的需要。但早期的硬盤和網(wǎng)絡(luò)流量都非常昂貴,UNICODE編碼里的每個(gè)字符卻占用了2個(gè)字節(jié)的容量,于是為了節(jié)省文件存儲(chǔ)時(shí)所占的硬盤空間,也為了節(jié)省字符在網(wǎng)絡(luò)傳輸過(guò)程中所占用的網(wǎng)絡(luò)流量,又制定了基于UNICODE、面向傳輸?shù)谋姸鄻?biāo)準(zhǔn),這些面向傳輸?shù)臉?biāo)準(zhǔn)統(tǒng)稱為UTF(UCS Transfer Format)。UNICODE編碼與UTF編碼并不是直接的一一對(duì)應(yīng),而是要通過(guò)一些算法和規(guī)則來(lái)轉(zhuǎn)換。UNICODE與UTF的關(guān)系是:UNICODE是根本、基礎(chǔ)、目的,而UTF只是一種實(shí)現(xiàn)UNICODE的手段、方法、過(guò)程。
常見(jiàn)的UTF格式有:UTF-8,UTF-16,UTF-32。其中UTF-8是互聯(lián)網(wǎng)上使用最廣的一種UNICODE的實(shí)現(xiàn)方式,它專為傳輸而設(shè)計(jì)。正因?yàn)閁TF-8是基于UNICODE而設(shè)計(jì)的傳輸實(shí)現(xiàn)方式,所以它能使編碼無(wú)國(guó)界,任意國(guó)家的文字都能在任意國(guó)家的電腦瀏覽器中里正常顯示。UTF-8最大的一個(gè)特點(diǎn)是:它是一種變長(zhǎng)的編碼方式,它可以使用1~4個(gè)字節(jié)表示一個(gè)符號(hào),根據(jù)不同的符號(hào)而變化字節(jié)長(zhǎng)度,當(dāng)能夠使用1字節(jié)表示一個(gè)符號(hào)時(shí),便使用1個(gè)字節(jié)來(lái)表示,如果需要2字節(jié)才能表示的符號(hào),便使用2個(gè)字節(jié)來(lái)表示,類推,直到4個(gè)字節(jié),從而節(jié)省硬盤存儲(chǔ)空間和網(wǎng)絡(luò)流量。
所以我們的網(wǎng)站在開(kāi)發(fā)時(shí)如果使用GB2312或GBK編碼,當(dāng)別的國(guó)家的電腦不支持漢字編碼,那么看到的將是亂碼,顯示出來(lái)類似這樣:口口口口口。而網(wǎng)站如果使用UTF-8編碼,則任意國(guó)家的電腦在打開(kāi)網(wǎng)站時(shí)其內(nèi)容會(huì)自動(dòng)轉(zhuǎn)換成UNICODE編碼,并且由于現(xiàn)在的電腦都支持UNICODE編碼,從而能正常顯示任意文字!
但是國(guó)內(nèi)很多的網(wǎng)站仍然使用GB2312或GBK編碼,這類網(wǎng)站通常只面對(duì)國(guó)內(nèi)用戶提供服務(wù),面對(duì)國(guó)內(nèi)用戶不會(huì)有顯示上的問(wèn)題。只是如果面對(duì)其他國(guó)家的瀏覽者,這類網(wǎng)站被打開(kāi)時(shí)很大程度上將呈現(xiàn)亂碼。
為了網(wǎng)站的高兼容性與國(guó)際化,推薦網(wǎng)站使用UTF-8編碼,而不是使用GB2312或GBK編碼。
指定網(wǎng)頁(yè)為UTF-8、GB2312和GBK的標(biāo)簽分別為:

<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<meta http-equiv="Content-Type" content="text/html; charset=gbk">

那么有一個(gè)問(wèn)題出現(xiàn)了:網(wǎng)頁(yè)各種編碼的區(qū)別,僅僅是在于這一行meta標(biāo)簽的設(shè)置差別嗎??jī)H僅是“utf-8”這5個(gè)字符換成“gb2312”這6個(gè)字符之類的這種“小差別”嗎?
不是的,差別不僅僅是這幾個(gè)字符的差別。當(dāng)網(wǎng)頁(yè)指定meta標(biāo)簽中的編碼為utf-8后,DreamWeaver在保存網(wǎng)頁(yè)時(shí)會(huì)自動(dòng)將網(wǎng)頁(yè)文件保存為utf-8的編碼格式(二進(jìn)制碼使用utf-8的編碼格式),meta標(biāo)簽中的utf-8編碼是為了告訴瀏覽器:這個(gè)網(wǎng)頁(yè)用的是utf-8編碼,請(qǐng)?jiān)陲@示時(shí)使用utf-8編碼的格式解析并呈現(xiàn)出來(lái);而如果meta標(biāo)簽中指定編碼為gb2312,DreamWeaver在保存網(wǎng)頁(yè)時(shí)會(huì)自動(dòng)將網(wǎng)頁(yè)文件保存為gb2312的編碼格式(二進(jìn)制碼使用gb2312的編碼格式),同樣,meta標(biāo)簽中的gb2312編碼只是為了告訴瀏覽器:這個(gè)網(wǎng)頁(yè)用的是gb2312編碼,請(qǐng)?jiān)陲@示時(shí)使用gb2312編碼的格式解析并呈現(xiàn)出來(lái)。我們做個(gè)試驗(yàn),將一個(gè)文本文件分別保存為utf-8格式(打開(kāi)記事本新建文本文件,輸入內(nèi)容后,選擇菜單:文件→另存為,編碼選擇為UTF-8)和gb2312格式(另存時(shí)編碼選擇為ANSI,ANSI代表當(dāng)前操作系統(tǒng)的默認(rèn)編碼,在簡(jiǎn)體中文Windows操作系統(tǒng)中,ANSI 編碼代表 GBK 編碼;在繁體中文Windows操作系統(tǒng)中,ANSI編碼代表Big5;在日文Windows操作系統(tǒng)中,ANSI 編碼代表 Shift_JIS 編碼,類推),對(duì)比其二進(jìn)制數(shù)據(jù)。這里使用UltraEdit-32文件編輯器對(duì)文本文件進(jìn)行16進(jìn)制查看,即使用16進(jìn)制查看文件的二進(jìn)制數(shù)據(jù):

從上圖中可以看到,使用utf-8編碼和使用gb2312編碼保存的文件,其二進(jìn)制數(shù)據(jù)是不一樣的,即這兩個(gè)文件的二進(jìn)制數(shù)據(jù)內(nèi)容是不一樣的。記事本軟件在打開(kāi)文本文件時(shí),會(huì)嘗試識(shí)別文件的編碼并進(jìn)行解析和顯示,即文字保存在記事本里,無(wú)論保存成utf-8編碼還是gb2312編碼,通常情況下記事本都能正常識(shí)別和顯示,不需要在文件里額外記錄數(shù)據(jù)以告知記事本該文件是什么編碼。但很多軟件卻無(wú)法做到智能識(shí)別文本文件的編碼,這就要求文本文件在保存時(shí),必須附帶一些特殊的內(nèi)容(額外的數(shù)據(jù))以告知該文件是什么編碼。UNICODE規(guī)范中有一個(gè)BOM(Byte Order Mark)的概念,就是字節(jié)序標(biāo)記,在文件頭部開(kāi)始位置寫入三個(gè)字節(jié)(EF BB BF)以告知該文件是utf-8編碼格式。但這個(gè)BOM又帶出了新的問(wèn)題:不是所有的軟件或處理程序都支持BOM,即不是所有的軟件或處理程序都能識(shí)別文件開(kāi)頭的(EF BB BF)這三個(gè)字節(jié)。當(dāng)不支持識(shí)別時(shí),這三個(gè)字節(jié)又會(huì)被當(dāng)成文件的實(shí)際數(shù)據(jù)內(nèi)容。早期的火狐不支持對(duì)BOM的識(shí)別,當(dāng)遇到BOM時(shí)會(huì)對(duì)這三個(gè)字節(jié)顯示出特殊的亂碼符號(hào);而到目前為止,PHP處理程序仍然不支持BOM,即當(dāng)一個(gè)PHP文件保存為utf-8時(shí),如果附帶了BOM,那么PHP處理程序會(huì)將BOM解析為PHP文件的實(shí)際數(shù)據(jù)內(nèi)容而導(dǎo)致出錯(cuò)!在DreamWeaver中,選擇軟件頭部菜單:修改→頁(yè)面屬性(也可以直接按快捷鍵ctrl+j),在彈出的頁(yè)面屬性面板中點(diǎn)選“標(biāo)題/編碼”,即可看到可供選擇的編碼。通常在改變網(wǎng)頁(yè)的編碼時(shí),使用這種方式改變。如下圖:

所以:當(dāng)我們?cè)趍eta標(biāo)簽中設(shè)置為utf-8編碼格式時(shí),網(wǎng)頁(yè)文件就必須要存儲(chǔ)為utf-8格式,這樣瀏覽器才能正常顯示網(wǎng)頁(yè)而不是顯示亂碼。如果在meta標(biāo)簽中設(shè)置utf-8編碼格式,網(wǎng)頁(yè)文件卻保存為gbk或其它格式,那么在打開(kāi)網(wǎng)頁(yè)時(shí)瀏覽器會(huì)接到網(wǎng)頁(yè)meta標(biāo)簽中格式的通知:使用utf-8編碼格式來(lái)解析和顯示網(wǎng)頁(yè),而網(wǎng)頁(yè)的二進(jìn)制碼(數(shù)據(jù)內(nèi)容)卻為gbk編碼或其它格式,顯示出來(lái)就會(huì)是亂碼!這好比相親時(shí),紅娘手里的資料有誤,錯(cuò)誤的告知男方:女方講英語(yǔ)(meta標(biāo)簽中設(shè)置為utf-8編碼)。結(jié)果女方卻不懂英語(yǔ)(文件卻不是utf-8編碼)。男方開(kāi)口一句“Hello”就讓女方不知所謂了(亂碼)。
我們來(lái)實(shí)驗(yàn)一下,網(wǎng)頁(yè)指定meta標(biāo)簽中的編碼為utf-8,文件卻保存為gbk格式:我們先用DreamWeaver編輯一個(gè)utf-8格式的網(wǎng)頁(yè)并保存,然后再用記事本打開(kāi)該網(wǎng)頁(yè),另存為,編碼選擇為ANSI。

<!DOCTYPE HTML>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>中文</title>
</head>
<body>
本文件使用dreamweaver保存后,再使用記事本打開(kāi),并另存為ANSI編碼。
</body>
</html>

在瀏覽器中的執(zhí)行結(jié)果如下:

綜上所述:網(wǎng)頁(yè)開(kāi)發(fā)時(shí),盡量使用utf-8編碼格式,并且在保存文件時(shí),保存為utf-8編碼。(dreamweaver在保存網(wǎng)頁(yè)文件時(shí),會(huì)根據(jù)<meta http-equiv="Content-Type" content="text/html; charset=編碼">所指定的編碼自動(dòng)保存為正確的對(duì)應(yīng)編碼,但如果使用其它網(wǎng)站代碼編輯器,比如記事本、Editplus等,就需要注意,在保存文件時(shí)要選擇為正確的編碼)。

聲明:本網(wǎng)頁(yè)內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問(wèn)題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

文檔

造成網(wǎng)頁(yè)亂碼的根本性原因是什么

造成網(wǎng)頁(yè)亂碼的根本性原因是什么:先看段代碼:<!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>網(wǎng)頁(yè)編碼</title&g
推薦度:
  • 熱門焦點(diǎn)

最新推薦

猜你喜歡

熱門推薦

專題
Top