關(guān)于編碼的唯一事實(shí)
如果你完全忘掉了我剛剛解釋過的內(nèi)容,沒有關(guān)系,請記住一點(diǎn),如果你不知道一個字符串所使用的編碼,這個字符串在你手中也就毫無意義。你不能再把腦袋埋進(jìn)沙中以為"純文本"就是ASCII。事實(shí)上,
根本就不存在所謂的"純文本"。
那么我們?nèi)绾蔚弥粋字符串所使用的空間是何種編碼呢?對于這個問題已經(jīng)有了標(biāo)準(zhǔn)的作法。如果是一份電子郵件,你必須在格式的頭部有如下語句: Content-Type: text/plain; charset="UTF-8"
對于一個網(wǎng)頁,傳統(tǒng)的想法是Web服務(wù)器會返回一個類似于Content-Type的http頭和Web網(wǎng)頁,注意,這里的字符編碼并不是在HTML中指出,而是在獨(dú)立的響應(yīng)headers中指出。
這帶來了一些問題。假設(shè)你擁有一個大的Web服務(wù)器,擁有非常多的站點(diǎn),每個站點(diǎn)都包括數(shù)以百計的Web頁面,而寫這些頁面的人可能使用不同的語言,他們在他們自己計算機(jī)上的FrontPage等工具中看到頁面正常顯示就提交了上來,顯然,服務(wù)器是沒有辦法知道這些文件究竟使用的是何種編碼,當(dāng)然 Content-Type頭也沒有辦法發(fā)送了。
如果可以把Content-Type夾在HTML文件中,那不是會變得非常方便?這個想法會讓純粹論者發(fā)瘋,你如何在不知道它的編碼的情況下讀一個HTML文件呢?答案很簡單,因?yàn)閹缀跛械木幋a在32-127的碼字都做相同的事情,所以不需要使用特殊字符,你可以從HTML文件中獲得你想要的Content-Type。 <html> <head> <meta http-equiv="Conent-Type" content="text/html" charset="utf-8">
注意,這里的meta標(biāo)簽必須在head部分第一個出現(xiàn),一旦瀏覽器看到這個標(biāo)簽就會馬上停止解析頁面,然后使用這個標(biāo)簽中給出的編碼從頭開始重新解析整個頁面。
如果瀏覽器在http頭或者meta標(biāo)簽中都找不到相關(guān)的Content-Type信息,那應(yīng)該怎么辦?Internet Explorer做了一些事情:它試圖猜測出正確的編碼,基于不同語言編碼中典型文本中出現(xiàn)的那些字節(jié)的頗率。因?yàn)楣爬系?比特的碼頁(code pages)傾向于把它們的國家編碼放置在128-255碼字的范圍內(nèi),而不同的人類語言字母系統(tǒng)中的字母使用頗率對應(yīng)的直方圖會有不同,所以這個方法可以奏效。雖然很怪異,但對于那些老忘記寫Content-Type的幼稚網(wǎng)頁編寫者而言,這個方法大多數(shù)情況下可以讓他們的頁面顯然OK。直到有一天,他們寫的頁面不再滿足"letter-frequency-distribution",Internet Explore覺得這應(yīng)該是朝鮮語,于是就當(dāng)朝鮮語來顯示了,結(jié)果顯然糟透了。這個頁面的讀者們立刻就遭殃了,一個保加利亞語寫的頁面卻用朝鮮語來顯示,效果會怎樣?于是讀者使用 查看-->編碼 菜單來不停地試啊試,直到他終于試出了正確的編碼,但前提是他知道可以這樣做,事實(shí)上大多數(shù)人根本不會這樣做。
在我的公司開發(fā)的一款Web頁面管理軟件CityDesk的最新版本中,我們決定像Visual Basic、COM和Windows NT/2000/XP所做的那樣,整個過程中使用UCS-2(兩個字節(jié))Unicode。在我們寫的C++代碼中,我們把所有的char類型換成了wchar_t,所有使用str函數(shù)的地方,換成了相應(yīng)的wcs函數(shù)(如使用wcscat和wcslen來替代strcat和strlen)。如果想在C中創(chuàng)建一個UCS-2的字符串,只需在字符串前面加L即可:L"Hello"。
當(dāng)CityDesk發(fā)布頁面的時候,它把所有的頁面都轉(zhuǎn)換成了UTF-8編碼,而差不多所有的瀏覽器都對UTF-8有不錯的支持。這就是"Joel On Software"(就是作者的首頁)編碼的方式,所以即使它擁有29個語言版本,至今也未聽到有一個人抱怨頁面無法瀏覽。
這篇文章已經(jīng)有點(diǎn)長了,而且我也沒有辦法告訴你關(guān)于字符編碼和Unicode的所有應(yīng)該了解的知識,但讀到現(xiàn)在我想你已經(jīng)掌握到基本的概念,回去編程時可以使用抗生素而不是螞蝗和咒語了,這就看做是留給你的作業(yè)吧。
本文鏈接:http://www.95time.cn/tech/program/2010/7432.asp
出處:
責(zé)任編輯:bluehearts
上一頁 關(guān)于字符集和Unicode的相關(guān)知識 [4] 下一頁
◎進(jìn)入論壇網(wǎng)絡(luò)編程版塊參加討論
|