點(diǎn)亮建筑新夢(mèng)想
LIGHT BUILDING NEW DREAM
企業(yè)BIM定制培訓(xùn)服務(wù)經(jīng)典案例
BIMBOX | 空間基因:建筑信息編碼簡史(一) 二維碼
今天開始,我們花上幾期的時(shí)間,給你講一個(gè)比較大的話題:建筑信息編碼。 2018年5月1日《GBT 51269-2017 建筑信息模型分類和編碼標(biāo)準(zhǔn)》正式執(zhí)行,很多人還是有一肚子的問號(hào)。 ● 編碼到底是什么?能干什么用? ● 為什么一定要編碼?用模型不行嗎? ● 編碼標(biāo)準(zhǔn)的執(zhí)行和我有什么關(guān)系?未來會(huì)影響哪些領(lǐng)域? 即便是對(duì)編碼稍有了解的人,也對(duì)它有兩個(gè)比較深的誤解: 誤解一:編碼就是給建筑物的構(gòu)件上「身份證」,給墻、柱、梁、板等物體賦予ID,統(tǒng)計(jì)用量時(shí)會(huì)比較方便。 但當(dāng)你去翻看《分類和編碼標(biāo)準(zhǔn)》的時(shí)候,會(huì)發(fā)現(xiàn)里面還有項(xiàng)目階段、工作成果、工具、甚至是參與角色的編碼,這些可不是建筑構(gòu)件啊,為什么也要編碼? 誤解二:編碼標(biāo)準(zhǔn)是給軟件開發(fā)商用的,和普通設(shè)計(jì)師沒關(guān)系,只要等軟件開發(fā)好了直接用就行了,編碼會(huì)自動(dòng)附在模型上。 理論上是這樣,但越來越多大型企業(yè)的項(xiàng)目或海外項(xiàng)目,已經(jīng)明確要求在提交設(shè)計(jì)內(nèi)容的時(shí)候按照某某規(guī)范進(jìn)行編碼,而軟件的「自動(dòng)編碼」功能還遙遙無期,這又該怎么辦? 這一個(gè)系列,我們就一步一步剝開建筑信息編碼這個(gè)大洋蔥,說清楚它到底是干什么用的,北美三大編碼體系和英國的Uniclass是怎么回事,我國的編碼體系是什么情況,新出的分類和編碼標(biāo)準(zhǔn)該怎么使用, 最后還會(huì)說到,面對(duì)工程項(xiàng)目的編碼需求,我們?cè)撌褂檬裁礃拥墓ぞ邅硗瓿晒ぷ鳌?/span> 好了,廢話不多說,BIMBOX開車了。 當(dāng)我們說編碼的時(shí)候,到底在說什么? 所謂編碼,就是「用通用性的符號(hào)來簡化某些含義」。人類的語言就是一種編碼。 比如,「天上那個(gè)早上出來傍晚落下去的金色火球」,就是個(gè)很長的含義,英文世界用「sun」這個(gè)字母組合來表達(dá)它。 中國就用一個(gè)圓圈中間加個(gè)點(diǎn)來表達(dá)它,后來這個(gè)符號(hào)演化成漢語里的「日」字。 不同地區(qū)使用不同的語言,這在人類文明發(fā)展的幾千年里都沒有出現(xiàn)大問題,文明互相接觸的時(shí)候可以互相學(xué)習(xí)對(duì)方的語言。一個(gè)人腦子里同時(shí)裝下「太陽」、「Sun」、「お日さま」幾個(gè)符號(hào)并不會(huì)出現(xiàn)混亂。 但到了計(jì)算機(jī)發(fā)明出來、人類進(jìn)入數(shù)字化時(shí)代的時(shí)候,麻煩可就出現(xiàn)了。 當(dāng)我們說建筑信息編碼的時(shí)候,一個(gè)大前提就是用計(jì)算機(jī)來進(jìn)行編碼。換句話說,就是把自然語言編寫成計(jì)算機(jī)可以讀取的數(shù)據(jù),這樣的數(shù)據(jù)才能自動(dòng)進(jìn)行計(jì)算和分析。 所以要說清建筑信息編碼,就得先用一期的內(nèi)容來說說人類進(jìn)入數(shù)字化時(shí)代碰到的麻煩,以及我們是怎么解決它們的,這件事還真沒想象那么簡單。 你可以做一個(gè)有趣的試驗(yàn):在任意文件夾新建一個(gè)TXT文檔,輸入「聯(lián)通」兩個(gè)字,保存關(guān)閉,再打開的時(shí)候,原來的兩個(gè)字變成了奇怪的亂碼。 這個(gè)詭異的現(xiàn)象,就是人們解決計(jì)算機(jī)編碼問題遺留下來的一個(gè)小尾巴。我們最后再來回答這是怎么回事。 從語言到數(shù)字 計(jì)算機(jī)一開始被發(fā)明出來是用來做算術(shù)題的,它通過內(nèi)部很多小開關(guān)的打開和關(guān)閉兩種狀態(tài),來表達(dá)不同的數(shù)字和運(yùn)算規(guī)則。 所以計(jì)算機(jī)只能處理兩個(gè)數(shù)字:0和1。一切數(shù)字都必須轉(zhuǎn)化成2進(jìn)制才能計(jì)算。十進(jìn)制是逢十進(jìn)一,二進(jìn)制是逢二進(jìn)一,十進(jìn)制的3轉(zhuǎn)化成二進(jìn)制就是11。 每一個(gè)小開關(guān)的0或者1的狀態(tài),叫做比特(Bit)。 仔細(xì)一想,你會(huì)覺得有點(diǎn)怪:計(jì)算機(jī)面對(duì)一大串0和1的時(shí)候,它怎么知道哪里開始、哪里結(jié)束,哪里斷開呢?比如下面這串二進(jìn)制數(shù)字,如果把它理解成一個(gè)數(shù),換算成10進(jìn)制就是72: 而如果把這串?dāng)?shù)字從中間斷成兩部分,就分別表達(dá)4和8兩個(gè)數(shù): 為了解決這個(gè)問題,人們就強(qiáng)制計(jì)算機(jī)每次都處理8個(gè)連在一起的數(shù)字,不能斷開,這8個(gè)比特組成的一個(gè)最小計(jì)算單元,就叫字節(jié)(Byte)。 你可以把一個(gè)字節(jié)看成一個(gè)編碼狀態(tài),每一位有兩種可能(0和1),一共8位,不同的排列組合可以表達(dá)出2的8次方=256種狀態(tài)。 人們發(fā)現(xiàn),這么多種狀態(tài)不僅可以表示數(shù)字,還可以把英文字母和一些特殊符號(hào)囊括進(jìn)來。這樣一來,計(jì)算機(jī)就不僅可以處理數(shù)學(xué)問題,還可以處理文字了。 不同字節(jié)狀態(tài)具體代表哪個(gè)字符,需要統(tǒng)一口徑。于是1968年,美國國家標(biāo)準(zhǔn)學(xué)會(huì)就制定了一套標(biāo)準(zhǔn),規(guī)定所有字節(jié)第一位統(tǒng)一為0,只用了八位數(shù)的后七位,也就是2的7次方=128種組合。 前32種是控制字符,讓計(jì)算機(jī)執(zhí)行一些特殊指令,比如00000000表示空字符,00001010表示換行。 從第33種組合開始,后邊的字符分別代表英文字母、數(shù)字或一些特殊符號(hào)。比如01010011代表S,00110000代表數(shù)字0。 這樣,英文單詞Sun就可以變成三個(gè)8位數(shù)的字節(jié),被計(jì)算機(jī)理解了。 這套標(biāo)準(zhǔn)叫做美國信息交換標(biāo)準(zhǔn)碼(American Standard Code for Information Interchange),簡稱ASCII。 后來,電腦從美國傳到了其他國家,像法國或者德國這些國家的語言里還有一些非英文字母,ASCII編碼方案就不夠用了。 不過沒關(guān)系,ASCII第一位統(tǒng)一都是0,只用了256種組合中的前128種。這些國家就在ASCII的基礎(chǔ)上,從第129種組合開始擴(kuò)展自己的編碼體系,把新增的符號(hào)定義為1開頭的字節(jié),這樣就把ASCII的容量擴(kuò)充了一倍。 這些國家擴(kuò)展的規(guī)則是不一樣的,同樣一個(gè)字節(jié),在阿拉伯或者俄羅斯的ASCII擴(kuò)展中代表不同的字母。 大家基本上是各用各的標(biāo)準(zhǔn),有得用總比沒得用強(qiáng),也還算是開心。 但也有其他人不開心。 比如中國,常用漢字有幾千個(gè),加上生僻字和少數(shù)民族語言符號(hào)有幾萬個(gè),區(qū)區(qū)256種組合怎么夠用? 沒辦法,我們只好自己開發(fā)一套編碼規(guī)則,不使用8位的單字節(jié),而是使用16位的雙字節(jié)來表達(dá)一個(gè)符號(hào)。這樣我們就有2的16次方=6萬多種組合可以用了。 中國的編碼標(biāo)準(zhǔn)從最早的GB2312,一直發(fā)展到最新的GB18030,從幾千個(gè)常用漢字?jǐn)U充到幾萬個(gè)符號(hào)。 為了解決中英文混合問題,GB系列編碼也必須向下兼容ASCII編碼才行, GB編碼標(biāo)準(zhǔn)規(guī)定:凡是以0開頭的字節(jié),都被認(rèn)為是ASCII編碼中的英文字符,凡是以1開頭的字節(jié),就告訴計(jì)算機(jī)還沒完,得把下一個(gè)字節(jié)也算進(jìn)來,組合起來表達(dá)一個(gè)漢字。 比如「S型人格」編碼就是下面這樣: 不過,這種雙字節(jié)中文字符和單字節(jié)英文字符并存的編碼方式,會(huì)帶來一個(gè)新麻煩:使用GB系列的編程人員需要萬分小心,一旦弄錯(cuò)了一個(gè)字節(jié),很可能后邊跟著的所有文字就全錯(cuò)了。 比如「S型人格」的二進(jìn)制編碼,如果把第一個(gè)字節(jié)中的第一位0替換成1,其他不變,即便只錯(cuò)了一個(gè)數(shù)字,也會(huì)導(dǎo)致一串編碼全部錯(cuò)誤。 這種情況在單字節(jié)的ASCII里是不會(huì)出現(xiàn)的。 如果說編程上的容錯(cuò)性可以通過我們辛勤的本土工程師來解決,那更大的麻煩還在后面。 霸氣的「終極語言編碼」 到這個(gè)時(shí)候,世界上的編碼體系已經(jīng)很混亂了。 非英語國家對(duì)ASCII碼用各自的方法擴(kuò)充,同樣的字節(jié)代表不同的符號(hào),中國這樣的國家還用單雙字節(jié)混編,甚至大陸和臺(tái)灣的編碼規(guī)則都互相沖突。 這對(duì)于跨國軟件公司和互聯(lián)網(wǎng)發(fā)展都是非常不方便的,使用軟件或者訪問網(wǎng)站,必須事先安裝對(duì)應(yīng)地區(qū)的編碼系統(tǒng),否則就會(huì)出現(xiàn)亂碼。 這時(shí)候國際標(biāo)準(zhǔn)化組織ISO站出來說:都別鬧了,我來制定一個(gè)大一統(tǒng)的編碼規(guī)則吧! 這套編碼規(guī)則俗稱Unicode,囊括了地球上所有文化的符號(hào)。因?yàn)楦鞯貐^(qū)的編碼已經(jīng)出現(xiàn)了沖突,大一統(tǒng)編碼已經(jīng)不能兼容不同國家現(xiàn)有的編碼了。 ISO的做法很暴力:除了對(duì)ASCII向下兼容,其他的編碼統(tǒng)統(tǒng)廢除,重新編。 16位的雙字節(jié)編碼只能組合出6萬多種可能,要做到大一統(tǒng)也不夠用。沒關(guān)系,再加位數(shù),加到32位的四字節(jié)編碼,排列組合高達(dá)42億種。這下用到宇宙文明統(tǒng)一也沒問題了。 不過,舊麻煩的解決總是會(huì)帶來新麻煩。 首先就是儲(chǔ)存效率問題。 對(duì)于歐美國家來說,本來用一個(gè)8位字節(jié)能解決的事,為了兼容其他語言,硬生生的要用雙字節(jié)甚至4字節(jié)來編碼,比如ASCII中字母S的編碼是「01010011」,到了Unicode里就要把前面的空位用一串0補(bǔ)足。 這樣,本來用1個(gè)G能儲(chǔ)存的文件,變成4字節(jié)的Unicode碼之后就會(huì)變成4個(gè)G。 更大的問題是網(wǎng)絡(luò)傳輸問題。 在Unicode編碼發(fā)明的時(shí)候,網(wǎng)速還是很慢的。如果一次傳輸4個(gè)字節(jié),效率就是單字節(jié)的四分之一。 想想你花錢買了20M的寬帶,因?yàn)閾Q了個(gè)編碼系統(tǒng),變成了5M的速度,擱誰也不干啊。 所以Unicode編碼在當(dāng)時(shí)遭到了英文國家的強(qiáng)烈抵制。 為了解決這個(gè)問題,人們又發(fā)明了Unicode編碼轉(zhuǎn)換格式(Unicode Transformation Format),簡稱UTF,來規(guī)定Unicode編碼的儲(chǔ)存和傳輸方式。 它分為UTF-8、UTF-16、UTF-32等等,顧名思義,UTF-32表示一次傳輸32位、4個(gè)字節(jié),UTF-8就表示一次傳輸8位、一個(gè)字節(jié)。 其中,UTF-8效率最高,最為常用。 既然UTF-8是一次傳輸一個(gè)字節(jié),計(jì)算機(jī)怎么知道當(dāng)前這個(gè)字節(jié)是完整表達(dá)了一個(gè)含義,還是后邊還跟著其他字節(jié)呢? UTF-8是變長度編碼,根據(jù)符號(hào)在Unicode中所在的編碼位置,定義了不同的字節(jié)長度模板: 如果一個(gè)符號(hào)在Unicode碼中占前127位,只需要一個(gè)字節(jié)就能表示,對(duì)應(yīng)的二進(jìn)制是0開頭的8位數(shù)字,那就直接傳輸這個(gè)字節(jié),并在這個(gè)字節(jié)結(jié)束,不需要前面再補(bǔ)0了。 也就是說,英文語言使用UTF-8和ASCII是一模一樣的。 位數(shù)增大,一個(gè)字節(jié)不夠用了,就套用這樣一個(gè)雙字節(jié)模板:第一個(gè)字節(jié)以110開頭,第二個(gè)字節(jié)以10開頭,告訴計(jì)算機(jī),這兩個(gè)字節(jié)需要組合起來共同表達(dá)一個(gè)符號(hào)。下圖中紅色的部分就是強(qiáng)制規(guī)定的模板數(shù)字。 位數(shù)繼續(xù)增大,兩個(gè)字節(jié)也不夠用了,就再套用一個(gè)三字節(jié)模板:第一個(gè)字節(jié)以1110開頭,后面兩個(gè)字節(jié)還是以10開頭,告訴計(jì)算機(jī),這是一個(gè)三字節(jié)組合的符號(hào)。 以此類推,四個(gè)字節(jié)的模板就是:第一個(gè)字節(jié)以11110開頭,后邊再跟著三個(gè)以10開頭的字節(jié)。 這樣,我們就解決了不同語言之間編碼兼容的問題,又解決了低位數(shù)編碼的傳輸效率問題。 當(dāng)一個(gè)文件以英文為主的時(shí)候,UTF-8的效率非常接近ASCII。不過對(duì)于中文來說,漢字用GB碼只需要兩個(gè)字節(jié),到了UTF-8里卻需要用3個(gè)字節(jié)來表達(dá)(因?yàn)樯蠄D中紅色的模板數(shù)字占去了4+2+2=8位),所以純中文的網(wǎng)站用UTF-8比用GB碼傳輸起來效率要低一些。 但前面我們說過,GB碼中英文混排的時(shí)候,會(huì)因?yàn)榕e(cuò)或者丟失一個(gè)字節(jié),導(dǎo)致后邊的所有文字全都錯(cuò)誤。而UTF-8在多字節(jié)組合的時(shí)候有一套嚴(yán)格的模板,中間一個(gè)字節(jié)出現(xiàn)了錯(cuò)誤,亂碼不會(huì)擴(kuò)散,比GB碼多了容錯(cuò)性的優(yōu)勢(shì)。 此外,使用UTF-8,其他國家的人不需要安裝中文編碼規(guī)則,也不會(huì)出現(xiàn)亂碼。所以國內(nèi)的新網(wǎng)站更偏愛使用UTF-8。 因?yàn)閁TF-8和GB碼兩者是完全不兼容的,所以一些老牌中文軟件和網(wǎng)站出于轉(zhuǎn)化成本的考慮,還是沿用GB系列的編碼。 說到這兒,我們就能解釋前邊那個(gè)記事本「聯(lián)通」兩個(gè)字亂碼的現(xiàn)象了。記事本在打開一個(gè)文檔的時(shí)候,不會(huì)問你是用什么格式儲(chǔ)存的,而是通過你輸入文字的代碼來「猜」它的編碼格式。 在我們輸入中文的時(shí)候,記事本默認(rèn)使用的是GB編碼,我們看「聯(lián)通」兩個(gè)字對(duì)應(yīng)的GB碼: 注意看紅色部分,是不是和UTF-8的雙字節(jié)模板正好一模一樣?所以當(dāng)你默認(rèn)保存再打開的時(shí)候,記事本通過這兩行代碼,猜測(cè)這個(gè)文檔用的是UTF-8格式,而UTF-8和GB編碼是不兼容的,于是就出現(xiàn)了亂碼。 你可以試試,在存有「聯(lián)通」的記事本文件另存的時(shí)候,選擇用UTF-8格式保存,或者多打幾個(gè)字,再打開就不會(huì)出現(xiàn)亂碼了。 好了,總結(jié)一下今天說到的幾個(gè)知識(shí)點(diǎn): ● 計(jì)算機(jī)無法理解自然語言,需要轉(zhuǎn)化成二進(jìn)制編碼; ● 英文和數(shù)字在轉(zhuǎn)化的時(shí)候效率最高,只需要用到8位的單字節(jié)編碼ASCII; ● 不同地區(qū)各自設(shè)計(jì)編碼,遲早會(huì)在交流中遇到問題,大一統(tǒng)編碼勢(shì)在必行; ● 編碼規(guī)則中,某一個(gè)符號(hào)必須嚴(yán)格對(duì)應(yīng)一個(gè)二進(jìn)制代碼,否則就會(huì)出現(xiàn)混亂; ● 新編碼規(guī)則不占用舊編碼的代碼,且保留原來的一一對(duì)應(yīng)關(guān)系,它就是向下兼容舊編碼的; ● 新編碼如果不兼容舊編碼,就會(huì)產(chǎn)生替換成本,從而引發(fā)一系列歷史遺留問題; ● 為解決一個(gè)麻煩創(chuàng)造新的編碼,經(jīng)常也會(huì)帶來新的麻煩; ● 編碼的簡潔高效與可擴(kuò)展性,往往不可兼得。 下一期開始,我們的建筑信息編碼就要正式登場(chǎng)了。你不妨先思考一個(gè)問題: 如果編碼只需要考慮語言兼容的問題,為什么光是北美地區(qū)就先后出現(xiàn)了Masterformat、Uniformat、Omniclass三種建筑編碼體系?比起語言編碼,建筑編碼是不是有更復(fù)雜的問題需要解決呢? 歡迎你把疑問和對(duì)編碼知識(shí)的見解留言給我們,我們會(huì)把你的高見和我們的回答補(bǔ)充到后面的連載內(nèi)容里。 有態(tài)度,有深度,BIMBOX,咱們下次見! |