不出所料,父母從廣東搬到上海后,最不適應(yīng)的就是方言:上海人聽不懂廣東話,他們也聽不懂上海話。幸好還有普通話可以說,要不就無法跟上海人交流了。
方言導(dǎo)致的問題很容易理解。但是在IT領(lǐng)域,類似問題卻困擾了很多人,尤其是當(dāng)涉及到NAS共享的時(shí)候。這個(gè)類似問題就是字符編碼。比如說,不同的員工使用同一個(gè)NAS共享。員工甲存的文件名是用GBK編碼的,員工乙存的文件名是UTF-8編碼的。雙方都會覺得對方的文件名是亂碼,根本無法理解。為了解決這個(gè)問題,外企員工一般使用英文,因?yàn)槊糠N編碼都能識別英文,就像上海人和廣東人都懂普通話一樣。但這方法并不現(xiàn)實(shí),普及英文在很多單位難以做到。本文要介紹的,就是(EMC的)NAS是如何解決這個(gè)問題的。
這要從字符編碼的概念開始說起:
- 字符(character):顧名思義,字符是文字與符號的總稱。英文字母,漢字和數(shù)學(xué)符號等都是字符。
- 編碼(encoding):計(jì)算機(jī)只能先將字符用二進(jìn)制碼來表示,然后再進(jìn)行處理或者存儲。把字符和2進(jìn)制碼對應(yīng)起來就叫編碼。比如字母A的編碼就是1000001。
最早給字符編碼的是美國人,他們的編碼方案叫做ASCII。那時(shí)候計(jì)算機(jī)還是稀罕物,也沒人想到有一天它會在全球普及。所以ASCII編碼只包含了拉丁字母和符號,加起來也就100多個(gè),用一個(gè)字節(jié)來編碼就足夠了(英文國家是不是文盲率很低?學(xué)好字母就差不多識字了)。
沒想到計(jì)算機(jī)普及得太快了。各國人民在學(xué)會說英文之前,已經(jīng)先學(xué)會使用電腦。所以很多非英文國家為自己的文字制定了符合ANSI(美國國家標(biāo)準(zhǔn)協(xié)會)標(biāo)準(zhǔn)的編碼,比如中國的GB2312和日本的JIT。ANSI標(biāo)準(zhǔn)保留了所有ASCII編碼,所以無論是GB2312,JIT還是其他國家的ANSI編碼都支持拉丁字母。中文字符比拉丁字母多太多了,一個(gè)字節(jié)表示不完,所以GB2312用兩個(gè)字節(jié)表示一個(gè)漢字。
ANSI標(biāo)準(zhǔn)解決了拉丁字母和另一種文字共存的問題,比如中文和英文可以一起出現(xiàn),日文和英文也可以。但是多種非拉丁文字卻無法共存,比如GB2312和JIT都不包含對方的字符,所以中文和日文就無法共存。有沒有辦法解決這個(gè)問題呢?還是以方言為例,我們把各地方言并在一起,看成一門語言,假如每個(gè)人都學(xué)會了這門語言,不就沒有交流問題了嗎?編碼也一樣,假如有一種編碼能把世界各地的字符都編進(jìn)去,各國文字就能夠共存了。到了上世紀(jì)90年代,Unicode終于應(yīng)運(yùn)而生。它收錄了超過10萬個(gè)字符,包括了世界上大多數(shù)文字系統(tǒng)。就連不同寫法的同一個(gè)字都分別編碼,比如戶/戶/戸等等,比孔乙己還考究。
有了Unicode,字符世界是不是就和諧了呢?事實(shí)并非如此,因?yàn)閁nicode只確定了編碼方式,沒規(guī)定實(shí)現(xiàn)方法。不同的平臺對Unicode有不同的實(shí)現(xiàn),比較流行的有UTF-8,UTF-16等。所以Unicode雖然保證了在同一平臺上多種非拉丁文字能共存,但跨平臺的時(shí)候就不一定了。比如說,用UTF-16編碼的客戶端在NAS上存了一個(gè)中文命名的文件,用UTF-8或者GBK編碼的客戶端看起來還是亂碼。
說完了這些背景,我們終于可以回到最初的話題:在(EMC的)NAS上是如何解決這個(gè)問題的?
答案就在下圖。NAS上只存UTF-8編碼。當(dāng)UTF-8客戶端往NAS讀寫文件的時(shí)候,NAS不作任何轉(zhuǎn)換。當(dāng)其他編碼的客戶端往NAS讀寫文件的時(shí)候,NAS就將其轉(zhuǎn)換為UTF-8。有了這個(gè)轉(zhuǎn)換機(jī)制,所有的客戶端都感受不到編碼差異。想要了解這功能如何配置,請參考EMC公開的NAS配置手冊。
當(dāng)然,再好的設(shè)計(jì)也不是完美的。有哪位讀者能看出這個(gè)轉(zhuǎn)換機(jī)制有什么潛在問題嗎?請留言。
注:該圖片來自EMC公開的Celerra的技術(shù)文檔。