亚洲综合原千岁中文字幕_国产精品99久久久久久久vr_无码人妻aⅴ一区二区三区浪潮_成人h动漫精品一区二区三

主頁 > 知識(shí)庫 > Unicode編碼大揭秘

Unicode編碼大揭秘

熱門標(biāo)簽:無錫電銷機(jī)器人銷售 招聘信息 福建ai電銷機(jī)器人加盟公司 揭陽外呼系統(tǒng)公司 南召400電話辦理資費(fèi) 鄭州中國移動(dòng)400電話申請 去哪里辦卡 地圖標(biāo)注植物名稱 熱血傳奇沃瑪森林地圖標(biāo)注 地圖標(biāo)注審核工作怎么樣注冊

如果你是一個(gè)生活在2003年的程序員,卻不了解字符、字符集、編碼和Unicode這些基礎(chǔ)知識(shí)。那你可要小心了,要是被我抓到你,我會(huì)讓你在潛水艇里剝六個(gè)月洋蔥來懲罰你。

這個(gè)邪惡的恐嚇是Joel Spolsky在十年前首次發(fā)出的。不幸的是,很多人認(rèn)為他只是在開玩笑,因此,現(xiàn)在仍有許多人不能完全理解Unicode,以及Unicode、UTF-8、UTF-16之間的區(qū)別。這就是我寫這篇文章的原因。

言歸正傳,設(shè)想在一個(gè)晴朗的下午,你收到一封電子郵件,它來自一個(gè)你高中之后就失去聯(lián)系的朋友,并帶有一個(gè)txt格式(也稱為純文本格式)的附件。這個(gè)附件包含下面這樣一串二進(jìn)制bits:

復(fù)制代碼 代碼如下:

0100100001000101010011000100110001001111

Email的正文是空的,這使它更加神秘。在你啟動(dòng)常用的文本編輯器打開這個(gè)附件之前,你有沒有想過,文本編輯器是怎么將二進(jìn)制形式翻譯成字符的?這其中有兩個(gè)關(guān)鍵問題:

1.字節(jié)是怎樣分組的?(例如1個(gè)字節(jié)的字符和2個(gè)字節(jié)的字符)

2.一個(gè)或多個(gè)字節(jié)是怎么映射到字符上的?

這些問題的答案就在這篇文檔(Character Encoding)中,大致說來,編碼定義了兩件事:

1.字節(jié)是怎么分組的,如8 bits或16 bits一組,這也被稱作編碼單元。

2.編碼單元和字符之間的映射關(guān)系。例如,在ASCII碼中,十進(jìn)制65映射到字母A上

字符編碼和字符集之間有微小的區(qū)別。不過通常它和你無關(guān),除非你在設(shè)計(jì)一個(gè)底層的庫。

ASCII碼是上個(gè)世紀(jì)最流行的編碼體系之一,至少在西方是這樣。下圖顯示了ASCII碼中編碼單元是怎么映射到字符上的。

有一個(gè)即使在經(jīng)驗(yàn)豐富的程序員中也非常常見的誤解就是,純文本使用ASCII碼并且每個(gè)字符都是8 bits。

事實(shí)是,沒有這樣的「純文本」。如果在內(nèi)存或者硬盤中有一個(gè)你不知道編碼的字符串,那你就無法翻譯或者顯示它。這絕對沒有第二條路可選。

那么當(dāng)你剛剛收到的附件沒有指定編碼格式的時(shí)候,計(jì)算機(jī)會(huì)如何翻譯它呢?這是否意味著你就永遠(yuǎn)也讀不到失去聯(lián)系的老朋友想跟你說的話了呢?在我們找到答案之前,我們首先回到那個(gè)年代————那個(gè)用錢能買到的最大硬盤是29MB的時(shí)代。

歷史回顧

很久以前,計(jì)算機(jī)制造商有自己的表示字符的方式。他們并不需要擔(dān)心如何和其它計(jì)算機(jī)交流,并提出了各自的方式來將字形渲染到屏幕上。隨著計(jì)算機(jī)越來越流行,廠商之間的競爭更加激烈,在不同的計(jì)算機(jī)體系間轉(zhuǎn)換數(shù)據(jù)變得十分蛋疼,人們厭煩了這種自定義造成的混亂。

最終,計(jì)算機(jī)制造商一起制定了一個(gè)標(biāo)準(zhǔn)的方法來描述字符。他們定義使用一個(gè)字節(jié)的低7位來表示字符,并且制作了如上圖所示的對照表來映射七個(gè)比特的值到一個(gè)字符上。例如,字母A是65,c是99,~是126等等, ASCII碼就這樣誕生了。原始的ASCII標(biāo)準(zhǔn)定義了從0到127 的字符,這樣正好能用七個(gè)比特表示。不過好景不長……


為什么選擇了7個(gè)比特而不是8個(gè)來表示一個(gè)字符呢?我并不關(guān)心。但是一個(gè)字節(jié)是8個(gè)比特,這意味著1個(gè)比特并沒有被使用,也就是從128到255的編碼并沒有被制定ASCII標(biāo)準(zhǔn)的人所規(guī)定,這些美國人對世界的其它地方一無所知甚至完全不關(guān)心。

其它國家的人趁這個(gè)機(jī)會(huì)開始使用128到255范圍內(nèi)的編碼來表達(dá)自己語言中的字符。例如,144在阿拉伯人的ASCII碼中是گ,而在俄羅斯的ASCII碼中是ђ。即使在美國,對于未使用區(qū)域也有各種各樣的利用。IBM PC就出現(xiàn)了“OEM 字體”或”擴(kuò)展ASCII碼”,為用戶提供漂亮的圖形文字來繪制文本框并支持一些歐洲字符,例如英鎊(£)符號(hào)。

再強(qiáng)調(diào)一遍,ASCII碼的問題在于盡管所有人都在0-127號(hào)字符的使用上達(dá)成了一致,但對于128-255號(hào)字符卻有很多很多不同的解釋。你必須告訴計(jì)算機(jī)使用哪種風(fēng)格的ASCII碼才能正確顯示128-255號(hào)的字符。

這對于北美人和不列顛群島的人來說不算什么問題,因?yàn)闊o論使用哪種風(fēng)格的ASCII碼,拉丁字母的顯示都是一樣的。英國人還需要面對的問題是原始的ASCII碼中不包含英鎊符號(hào),但是這個(gè)已經(jīng)無關(guān)緊要了。

與此同時(shí),在亞洲有更讓人頭疼的問題。亞洲語言有更多的字符和字形需要被存儲(chǔ),一個(gè)字節(jié)已經(jīng)不夠用了。所以他們開始使用兩個(gè)字節(jié)來存儲(chǔ)字符,這被稱作DBCS(雙字節(jié)編碼方案)。在DBCS中,字符串操作變得很蛋疼,你應(yīng)該怎么做str++或str–?

這些問題成為了系統(tǒng)開發(fā)者的噩夢。例如,MS DOS必須支持所有風(fēng)格的ASCII碼,因?yàn)樗麄兿氚衍浖u到其他國家去。他們提出了「內(nèi)碼表」這一概念。例如,你需要告訴DOS(通過使用”chcp”命令)你想使用保加利亞語的內(nèi)碼表,它才能顯示保加利亞字母。內(nèi)碼表的更換會(huì)應(yīng)用到整個(gè)系統(tǒng)。這對使用多種語言工作的人來說是一個(gè)問題,因?yàn)樗麄儽仨氼l繁的在幾個(gè)內(nèi)碼表之間來回切換。

盡管內(nèi)碼表是一個(gè)好主意,但是它不是一個(gè)簡潔的解決方案,它只是一個(gè)hack技術(shù)或者說是簡單的修正來讓編碼系統(tǒng)可以工作。

進(jìn)入U(xiǎn)nicode的世界

最終,美國人意識(shí)到他們應(yīng)該提出一種標(biāo)準(zhǔn)方案來展示世界上所有語言中的所有字符,以便緩解程序員的痛苦和避免字符編碼引發(fā)的第三次世界大戰(zhàn)。出于這個(gè)目的,Unicode誕生了。

Unicode背后的想法非常簡單,然而卻被普遍的誤解了。Unicode就像一個(gè)電話本,標(biāo)記著字符和數(shù)字之間的映射關(guān)系。Joel稱之為「神奇數(shù)字」,因?yàn)樗鼈兛赡苁请S機(jī)指定的,而且不會(huì)給出任何解釋。官方術(shù)語是碼位(Code Point),總是用U+開頭。理論上每種語言中的每種字符都被Unicode協(xié)會(huì)指定了一個(gè)神奇數(shù)字。例如希伯來文中的第一個(gè)字母א,是U+2135,字母A是U+0061。

Unicode并不涉及字符是怎么在字節(jié)中表示的,它僅僅指定了字符對應(yīng)的數(shù)字,僅此而已。

關(guān)于Unicode的其它誤解包括:Unicode支持的字符上限是65536個(gè),Unicode字符必須占兩個(gè)字節(jié)。告訴你這些的人應(yīng)該去換換腦子了。

記住,Unicode只是一個(gè)用來映射字符和數(shù)字的標(biāo)準(zhǔn)。它對支持字符的數(shù)量沒有限制,也不要求字符必須占兩個(gè)、三個(gè)或者其它任意數(shù)量的字節(jié)。

Unicode字符是怎樣被編碼成內(nèi)存中的字節(jié)這是另外的話題,它是被UTF(Unicode Transformation Formats)定義的。

Unicode編碼

兩個(gè)最流行的Unicode編碼方案是UTF-8和UTF-16。讓我們看看它們的細(xì)節(jié)。

UTF-8

UTF-8是一個(gè)非常驚艷的概念,它漂亮的實(shí)現(xiàn)了對ASCII碼的向后兼容,以保證Unicode可以被大眾接受。發(fā)明它的人至少應(yīng)該得個(gè)諾貝爾和平獎(jiǎng)。

在UTF-8中,0-127號(hào)的字符用1個(gè)字節(jié)來表示,使用和US-ASCII相同的編碼。這意味著1980年代寫的文檔用UTF-8打開一點(diǎn)問題都沒有。只有128號(hào)及以上的字符才用2個(gè),3個(gè)或者4個(gè)字節(jié)來表示。因此,UTF-8被稱作可變長度編碼。

回到文章開始的問題,來自你老朋友的附件的字節(jié)流如下:

復(fù)制代碼 代碼如下:

0100100001000101010011000100110001001111

這個(gè)字節(jié)流在ASCII和UTF-8中表示相同的字符:HELLO

UTF-16

另一個(gè)流行的可變長度編碼方案是UTF-16,它使用2個(gè)或者4個(gè)字節(jié)來存儲(chǔ)字符。然而,人們逐漸意識(shí)到UTF-16可能會(huì)浪費(fèi)存儲(chǔ)空間,但那是另一個(gè)話題了。

低字節(jié)序(Little Endian)和高字節(jié)序(Big Endian)

Endian讀作End-ian或者Indian。這個(gè)術(shù)語的起源可以追溯到格列佛游記。(小說中,小人國為水煮蛋應(yīng)該從大的一端(Big-End)剝開還是小的一端(Little-End)剝開而爭論,爭論的雙方分別被稱為“大端派”和“小端派”。)

低字節(jié)序和高字節(jié)序只是一個(gè)關(guān)于在內(nèi)存中存儲(chǔ)和讀取一段字節(jié)(被稱作words)的約定。這意味著當(dāng)你讓計(jì)算機(jī)用UTF-16把字母A(占兩個(gè)字節(jié))存在內(nèi)存中時(shí),使用哪種字節(jié)序方案決定了你把第一個(gè)字節(jié)放在第二個(gè)字節(jié)的前面還是后面。這么說有點(diǎn)不太容易懂,讓我們來看一個(gè)例子:當(dāng)你使用UTF-16存下來自你朋友的附件時(shí),在不同的系統(tǒng)中它的后半部分可能是這樣的:

00 68 00 65 00 6C 00 6C 00 6F(高字節(jié)序,高位字節(jié)被存在前面)

68 00 65 00 6C 00 6C 00 6F 00(低字節(jié)序,低位字節(jié)被存在前面)

字節(jié)序方案只是一個(gè)微處理器架構(gòu)設(shè)計(jì)者的偏好問題,例如,Intel使用低字節(jié)序,Motorola使用高字節(jié)序。

字節(jié)順序標(biāo)記(BOM)

如果你經(jīng)常要在高低字節(jié)序的系統(tǒng)間轉(zhuǎn)換文檔,并且希望區(qū)分字節(jié)序,還有一種奇怪的約定,被稱作BOM。BOM是一個(gè)設(shè)計(jì)得很巧妙的字符,用來放在文檔的開頭告訴閱讀器該文檔的字節(jié)序。在UTF-16中,它是通過在第一個(gè)字節(jié)放置FE FF來實(shí)現(xiàn)的。在不同字節(jié)序的文檔中,它會(huì)被顯示成FF FE或者FE FF,清楚的把這篇文檔的字節(jié)序告訴了解釋器。

BOM盡管很有用,但并不是很簡潔,因?yàn)檫€有一個(gè)類似的概念,稱作「魔術(shù)字」(Magic Byte),很多年來一直被用來表明文件的格式。BOM和魔術(shù)字間的關(guān)系一直沒有被清楚的定義過,因此有的解釋器會(huì)搞混它們。

恭喜你讀到這里,你一定是一個(gè)很有耐心的讀者。

還記得文章開頭的問題嗎,既然沒有「純文本」文件這回事,那你的文本編輯器和瀏覽器為什么每次都能正確的顯示內(nèi)容呢?答案是,那些軟件欺騙了你,這也是為什么那么多人對編碼一無所知。當(dāng)軟件不能確定編碼的時(shí)候,它會(huì)猜測。大部分時(shí)候,它會(huì)猜測是否是涵蓋了ASCII碼的UTF-8,還是ISO-8859-1,也有可能猜其他能想到的任意字符集。因?yàn)橛⑽闹惺褂玫睦∽帜副碓趲缀跛械淖址卸寄茱@示,包括UTF-8,所以即使編碼猜錯(cuò)了,英文字母看起來也是正確的。

但是,如果你在瀏覽網(wǎng)頁時(shí)看到�符號(hào),這意味著這個(gè)網(wǎng)頁的編碼不是你的瀏覽器猜測的那個(gè)。這時(shí)你可以點(diǎn)開瀏覽器的查看——>字符編碼菜單來嘗試不同的編碼。

總結(jié)

如果你沒時(shí)間讀整篇文章或者你僅僅是略讀了一下前面的內(nèi)容。那請你確保你能理解下面的幾條:

這個(gè)世界上從來沒有純文本這回事,如果你想讀出一個(gè)字符串,你必須知道它的編碼。

Unicode是一個(gè)簡單的標(biāo)準(zhǔn),用來把字符映射到數(shù)字上。Unicode協(xié)會(huì)的人會(huì)幫你處理所有幕后的問題,包括為新字符指定編碼。

Unicode并不告訴你字符是怎么編碼成字節(jié)的。這是被編碼方案決定的,通過UTF來指定。

還有最重要的:

永遠(yuǎn)記得通過Content-Type或者meta charset標(biāo)簽來顯式指定你的文檔的編碼。這樣瀏覽器就不需要猜測你使用的編碼了,他們會(huì)準(zhǔn)確的使用你指定的編碼來渲染文檔。

您可能感興趣的文章:
  • utf8和unicode編碼究竟是什么關(guān)系?有何區(qū)別?
  • UTF-8 Unicode Ansi 漢字GB2321幾種編碼轉(zhuǎn)換程序
  • Encode/DecodeANSIlt;-gt;UTF8兩個(gè)編碼工具 下載
  • 淺析c++ 宏 #val 在unicode下的使用
  • 淺析內(nèi)存對齊與ANSI C中struct型數(shù)據(jù)的內(nèi)存布局
  • java實(shí)現(xiàn)十六進(jìn)制字符unicode與中英文轉(zhuǎn)換示例
  • Mysql中的排序規(guī)則utf8_unicode_ci、utf8_general_ci的區(qū)別總結(jié)
  • VC中實(shí)現(xiàn)GB2312、BIG5、Unicode編碼轉(zhuǎn)換的方法
  • C語言中字符和字符串處理(ANSI字符和Unicode字符)

標(biāo)簽:東莞 鹽城 南昌 文山 黔南 景德鎮(zhèn) 宣城 桂林

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《Unicode編碼大揭秘》,本文關(guān)鍵詞  Unicode,編碼,大,揭秘,Unicode,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《Unicode編碼大揭秘》相關(guān)的同類信息!
  • 本頁收集關(guān)于Unicode編碼大揭秘的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    麻豆网站在线看| 日韩免费在线| 欧美一级视| 日韩中文字幕在线观看视频| 国产精品免费久久| 欧美电影免费看大全| 你懂的国产精品| 日韩女人做爰大片| 午夜在线影院| 久久国产影视免费精品| 国产伦精品一区三区视频| 尤物视频网站在线观看| 午夜精品国产自在现线拍| 青青久久国产成人免费网站| 国产原创视频在线| 四虎影视库| 国产成人精品综合久久久| 中文字幕一区二区三区精彩视频| 欧美爱爱网| 国产亚洲精品成人a在线| 国产伦精品一区三区视频| 久久国产一区二区| 精品国产一级毛片| 韩国三级香港三级日本三级| 一级片免费在线观看视频| 亚洲第一页色| 国产一区免费在线观看| 欧美激情一区二区三区在线播放 | 国产成人啪精品视频免费软件| 免费国产在线观看| 可以免费看污视频的网站| 精品国产一区二区三区精东影业| 四虎影视久久久| 国产不卡福利| 国产麻豆精品免费密入口| 亚洲第一视频在线播放| 欧美激情在线精品video| 国产不卡高清| 91麻豆国产福利精品| 九九精品久久久久久久久| 一级毛片看真人在线视频| 二级片在线观看| 精品在线免费播放| 天天做日日爱夜夜爽| 国产麻豆精品| 亚洲天堂在线播放| 亚洲www美色| 九九久久国产精品大片| 成人免费网站久久久| 91麻豆精品国产高清在线| 一级毛片视频播放| 日本久久久久久久 97久久精品一区二区三区 狠狠色噜噜狠狠狠狠97 日日干综合 五月天婷婷在线观看高清 九色福利视频 | 日日夜夜婷婷| 欧美日本国产| 午夜激情视频在线播放| 欧美爱爱网| 国产一区免费在线观看| 免费国产在线观看不卡| 久久久久久久久综合影视网| 国产精品1024永久免费视频| 国产韩国精品一区二区三区| 天天做人人爱夜夜爽2020| 国产视频久久久| 一级片免费在线观看视频| 国产91素人搭讪系列天堂| 日韩一级黄色| 可以在线看黄的网站| 国产一区二区精品在线观看| 日本免费区| 久久久久久久免费视频| 亚洲精品久久玖玖玖玖| 美女免费毛片| 国产亚洲免费观看| 色综合久久久久综合体桃花网| 国产成人精品综合在线| 日韩在线观看视频免费| 欧美激情一区二区三区视频高清| 日韩专区亚洲综合久久| 香蕉视频亚洲一级| 成人免费观看视频| 99色视频在线| 九九九网站| 国产麻豆精品| 日韩在线观看免费| a级毛片免费全部播放| 91麻豆高清国产在线播放| 欧美夜夜骑 青草视频在线观看完整版 久久精品99无色码中文字幕 欧美日韩一区二区在线观看视频 欧美中文字幕在线视频 www.99精品 香蕉视频久久 | 国产伦精品一区三区视频| 国产欧美精品| 日本特黄一级| 欧美电影免费| 黄视频网站在线看| 青青久久国产成人免费网站| 国产91丝袜在线播放0| 精品久久久久久免费影院| 国产一区二区精品尤物| 久草免费资源| 久久国产一久久高清| 中文字幕一区二区三区 精品| 黄视频网站在线观看| 成人av在线播放| 可以免费看污视频的网站| 国产视频一区在线| 久草免费资源| 日韩av成人| 久久国产精品只做精品| 你懂的日韩| 你懂的国产精品| 999久久狠狠免费精品| 美女免费毛片| 青青青草视频在线观看| 成人高清视频在线观看| 青草国产在线观看| 久久99这里只有精品国产| 国产视频久久久| 91麻豆高清国产在线播放| 黄视频网站免费看| 久久成人性色生活片| 成人免费观看网欧美片| 欧美一区二区三区性| 国产伦精品一区二区三区在线观看 | 香蕉视频久久| 国产麻豆精品高清在线播放| 亚洲 欧美 成人日韩| 四虎影视久久久| 国产亚洲精品成人a在线| 国产成人精品综合在线| 欧美夜夜骑 青草视频在线观看完整版 久久精品99无色码中文字幕 欧美日韩一区二区在线观看视频 欧美中文字幕在线视频 www.99精品 香蕉视频久久 | 99久久网站| 日本伦理黄色大片在线观看网站| 精品国产一区二区三区国产馆| 久久国产一区二区| 精品视频在线观看免费| 成人a级高清视频在线观看| 韩国三级香港三级日本三级| 天天色成人网| 亚洲第一色在线| 91麻豆国产| 一a一级片| 日韩在线观看免费| 国产伦精品一区二区三区无广告| 999久久66久6只有精品| 91麻豆高清国产在线播放| 91麻豆精品国产片在线观看| 欧美激情一区二区三区视频高清| 欧美一区二区三区性| 国产伦精品一区三区视频| 免费的黄视频| 亚洲精品影院一区二区| 99色播| 国产一区二区精品尤物| 999精品在线| 亚欧成人乱码一区二区| 精品视频一区二区| 一本高清在线| 欧美激情一区二区三区视频| 精品国产三级a| 国产成人精品影视| 韩国毛片| 亚洲第一色在线| 欧美α片无限看在线观看免费| 一级女性全黄久久生活片| 欧美激情一区二区三区在线播放| 一本高清在线| 黄色福利| 亚欧视频在线| 黄视频网站免费观看| 青青青草视频在线观看| 国产一区二区精品在线观看| 精品视频在线观看一区二区| 国产91素人搭讪系列天堂| 欧美a级片免费看| 精品视频免费看| 九九九网站| 日韩专区一区| 国产美女在线一区二区三区| 99色视频在线| 欧美日本免费| 国产国语对白一级毛片| 香蕉视频一级| 国产一区二区精品久久91| 欧美国产日韩久久久| 欧美另类videosbestsex久久 | 日韩中文字幕在线播放| 可以免费看毛片的网站| 日韩免费在线视频| 香蕉视频一级| 国产麻豆精品免费密入口| 久久99这里只有精品国产| 四虎久久精品国产| 尤物视频网站在线观看| 香蕉视频一级| 精品久久久久久中文字幕2017| 国产一区精品| 久久国产精品自线拍免费| 99色播| 国产麻豆精品视频| 日韩一级黄色片| 尤物视频网站在线| 午夜在线亚洲|