當前位置:
首頁 > 最新 > 被我忽視的Unicode

被我忽視的Unicode

最近要封裝一個基於OpenCV的lib庫,為了同時支持「使用多位元組字符集」和「使用Unicode字符集」,在介面中使用了LPCTSTR這樣的參數類型:

之前對Unicode方面的知識不是很在意,這次又學習了一下。

從Windows的歷史說起

西雅圖當地時間3月29日一早,微軟CEO薩提亞·納德拉(Satya Nadella)發全員信宣布重組,主要業務部門之一的「Windows 及設備部門」被拆散之後併入兩個事業部,不再有單獨的Windows部門。這個時候回憶Windows的歷史是不是很應景?

1980年,西雅圖電腦產品公司僱員蒂姆·帕特森(Tim Paterson)花費了四個月時間編寫出了86-DOS 操作系統。微軟隔年以五萬美元購得該產品的全部版權,並將它更名為MS-DOS。隨後IBM發布了第一台個人電腦,當時採用的操作系統是西雅圖電腦產品公司的86-DOS系統,但微軟很快改進了MS-DOS,並使它成功地成為IBM電腦採用的操作系統。一個買來的系統、英特爾的硬體、IBM的開放標準,這些讓微軟成了早期PC市場的控制者。

但真正讓微軟成為微軟的,還是 Windows。

1983年,蓋茨宣布微軟計劃為IBM PC開發Windows操作系統,並在紐約廣場飯店發布預覽圖。微軟搶在Macintosh之前(在Lisa之後),對外演示了採用圖形界面,有窗口、圖標和可以指向並點擊的滑鼠的新系統。

1985年,Windows 1.0在微軟成立十周年的時候正式發布。就像大多數微軟的第一代產品一樣,Windows 1.0體驗糟糕、能運行的軟體也不多。直到1986年Microsoft Works辦公應用出現在Windows上,後者銷量才得以提升。但微軟善於修復問題,之後微軟差不多每2-3年帶來一次大版本更新。到Windows 95的時候,Windows操作系統已經佔據超過80%的市場份額,微軟年銷售額首次突破10億美元。

Windows 95讓個人電腦變得足夠易用,開始在家庭和企業辦公市場普及。但它有名的藍屏一直沒有解決,它依賴的操作系統內核不夠穩定。企業已經接受Windows和Office作為日常辦公所用,但在1980、1990年代都還在用不同於個人電腦的工作站、伺服器處理對穩定性和性能要求更高的工作。讓微軟真正控制整個計算機市場的是Windows NT。

之後WIndows NT不但接管了微軟的伺服器系統,還在Windows Me的巨大失敗之後替換掉原有內核,成為Windows XP、Windows 7更個人操作系統的內核。從Windows NT開始,微軟讓個人電腦開始代替工作站、專用伺服器,毀了IBM、Sun最後的硬體生意。

大企業成為微軟客戶後,會跟微軟簽企業協議(EA)。作為這項協議的一部分,微軟會為協議中的軟體部分提供折扣。例如,Windows授權費或SQL Server資料庫授權費或者Office。企業花錢用上Windows之後,又買了微軟的更多軟體。1994年前後,Word、Excel、PPT這三個應用的市場份額超過50%,1998年接近100%。

2010年,移動市場最後的機會,微軟錯過了。當時蘋果極其強勢,而Google對幾個傳統行業的顛覆也引起運營商和手機廠商的警覺。在2010年,手機廠商和運營商都願意再來一個操作系統。重新設計的Windows Phone 7在那年夏天來了。在商業模式上,微軟還想複製個人電腦市場的做法:微軟做操作系統,手機生產商生產硬體,並為每一部搭載Windows系統的手機支付授權費。

與此相對的,Android不要錢。更糟糕的是,WP7發布後,微軟沒有繼續迭代系統,而是提出一個統一手機、電腦的大計劃,讓Windows在手機市場停了兩年。

等到納德拉2013年接手微軟時,Windows敗局已定。時任微軟首席運營官Kevin Turner在2014年承認全球只有14%的聯網設備運行Windows操作系統。再往前倒退十年,這一數字為97%。之後納德拉通過一系列改組削弱了Windows在微軟的地位。其中最重要兩步一個是讓硬體業務併入Windows部門、讓盈利豐厚的Windows背上了硬體部門的虧損。微軟各部門都要對盈虧負責,最終Windows部門不得不選擇放棄手機部門。

另一個是允許Office等核心業務優先開發其它操作系統產品,比如為觸控重新設計的Office最早出現在iPad上,這在此前是不可能的。當Windows佔據九成市場份額時,微軟所有產品儘可能的綁著它,可以避免用戶流失。但當Windows不斷下滑淪為一個小眾產品時,其他產品再綁著它只會被拖累。納德拉的去Windows化是不得已的選擇。

沒有了Windows部門的微軟是個什麼公司?它在用戶眼裡的形象模糊起來,一如早先失去了計算機市場的IBM。

Windows歷史說完,就要說字符集的歷史了

雖然不能確定人類開始講話的時間,但書寫已有大約6000年的歷史了。早期書寫的內容是象形文字,1838年到1854年間發明了電報,使用Morse代碼書寫語言。

有了計算機之後,自然也需要表達信息。早期電腦的字元碼是從Hollerith卡片發展而來的。50年代後期,ASCII碼(美國信息交換標準代碼)開始使用,字元長度為7位,總共128個字元碼。

而ASCII碼的最大問題就是A,美國。它不能良好滿足其他講英語國家的需要,例如英國的英鎊符號。

ASCI字符集:擴展了ASCII碼,有256個字元碼。正式的名稱應該是MBCS(Multi-Byte Chactacter System,即多位元組字元系統)

DBCS字符集:解決中國、日本和韓國的象形文字元號,大約有21000個。

Unicode字符集

Unicode與DBCS的區別是:Unicode是統一的16位表示,而不是含有一些1個位元組代碼和一些2個位元組代碼的雙位元組字符集。Unicode的最大好處是這裡只有一個字符集,沒有一點含糊。缺點是:佔用內存是ASCII字元串的兩倍。然而,寬字元不等於Unicode,Unicode是一種可能的寬字符集。

Windows 2000是使用Unicode從頭進行開發的,如果調用任何一個Windows函數並給它傳遞一個ANSI字元串,那麼系統首先要將字元串轉換成Unicode,然後將Unicode字元串傳遞給操作系統。如果希望函數返回ANSI字元串,系統就會首先將Unicode字元串轉換成ANSI字元串,然後將結果返回給你的應用程序。進行這些字元串的轉換需要佔用系統的時間和內存。通過從頭開始用Unicode來開發應用程序,就能夠使你的應用程序更加有效地運行。

Unicode說了這麼多,是否說服了你一直用Unicode?

「Windows核心編程第5版」第2章就是講:字元和字元串處理。文中指出:本章的位置之所以如此靠前,是由於我極力主張在應用程序始終使用Unicode字元串,並且始終應該通過新的安全字元串函數來處理這些字元串,書中每一章和每一個示常式序都涉及Unicode字元串安全使用相關的問題,因為緩衝區溢出錯誤(這是處理字元串時的典型錯誤)已成為針對應用程序乃至操作系統的各個組件發起安全攻擊的媒介。

書中給出了使用Unicode的具體理由:

有利於應用程序的本地化

可支持所有語言

代碼執行速度更快,佔用內存更少

應用程序能輕鬆調用所有尚未棄用的Windows函數

應用程序的代碼很容易與COM集成

應用程序的代碼很容易與.NET Framework集成

能保證應用程序的代碼能夠輕鬆操縱我們自己的資源

推薦的字元和字元串的處理方式:

用通用數據類型(如TCHAR/LPCTSTR)來表示文本字元和字元串

用明確的數據類型(如BYTE)來表示位元組、位元組指針和數據緩衝區

用_T宏來表示字面量字元和字元串

_T的作用是讓你的程序支持Unicode編碼,如果你採用ANSI方式,_T就不起任何作用,_T和_L的區別在於,_L不管你是以什麼方式編譯,一律以Unicode方式保存。

OpenCV是不支持Unicode的,比如用imread函數讀取圖片,傳入的圖片路徑就是string類型的,為了同時支持Unicode和多位元組字符集,首先添加條件編譯代碼:

這樣就可以一直使用tstring,在調用OpenCV函數,需要傳入string類型的地方再做區分,比如:

ws2s函數如下:

完。

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 老王AI路 的精彩文章:

圖像處理利器OpenCV

TAG:老王AI路 |