VS2010 Unicode和Multi-Byte
轉載: https://blog.csdn.net/tinyhell127/article/details/7530311
error C2664: ‘cvLoadImage’ : cannot convert parameter 1 from ‘CString’ to ‘const char *’
如果程式在VC6.0除錯沒有問題,而到了VS卻出現這個問題。project->properties->configurations Properties -> General ->Project Defaults -> Charater Set中將Unicode字符集改為Multi-Byte即可。
關於兩種編碼方式參考以下博文,原文地址:http://blog.163.com/[email protected]/blog/static/14028002720114141012541/
編碼我們大致可以分為兩類:檔案編碼和記憶體編碼。檔案編碼(用UntraEdit可以看到裡面的編碼)即原始碼檔案的編碼,gbk,UTF-8等。記憶體編碼即原始碼編譯成為二進位制檔案的時候採用的編碼。在此我要說的是記憶體編碼;記憶體編碼在VC中只有3個選項:Not Set,Use Multi-Byte Character Set和Use Unicode Character Set。
1)multi-byte character set(MBCS):多位元組字符集,字元的大小是可變的;一個MBCS編碼包含一些一個位元組長的字元,而另一些字元大於一個位元組的長度。
2)Unicode:一種所有的字元都使用兩個位元組編碼的編碼模式。
. Unicode
後來,有人開始覺得太多編碼導致世界變得過於複雜了,讓人腦袋疼,於是大家坐在一起拍腦袋想出來一個方法:所有語言的字元都用同一種字符集來表示,這就是Unicode。
最初的Unicode標準UCS-2使用兩個位元組表示一個字元,所以你常常可以聽到Unicode使用兩個位元組表示一個字元的說法。但過了不久有人覺得256*256太少了,還是不夠用,於是出現了UCS-4標準,它使用4個位元組表示一個字元,不過我們用的最多的仍然是UCS-2。
UCS(Unicode Character Set)還僅僅是字元對應碼位的一張表而已,比如”漢”這個字的碼位是6C49。字元具體如何傳輸和儲存則是由UTF(UCS Transformation Format)來負責。
一開始這事很簡單,直接使用UCS的碼位來儲存,這就是UTF-16,比如,”漢”直接使用\x6C\x49儲存(UTF-16-BE),或是倒過來使用\x49\x6C儲存(UTF-16-LE)。但用著用著美國人覺得自己吃了大虧,以前英文字母只需要一個位元組就能儲存了,現在大鍋飯一吃變成了兩個位元組,空間消耗大了一倍……於是UTF-8橫空出世。
UTF-8是一種很彆扭的編碼,具體表現在他是變長的,並且相容ASCII,ASCII字元使用1位元組表示。然而這裡省了的必定是從別的地方摳出來的,你肯定也聽說過UTF-8裡中文字元使用3個位元組來儲存吧?4個位元組儲存的字元更是在淚奔……(具體UCS-2是怎麼變成UTF-8的請自行搜尋)
另外值得一提的是BOM(Byte Order Mark)。我們在儲存檔案時,檔案使用的編碼並沒有儲存,開啟時則需要我們記住原先儲存時使用的編碼並使用這個編碼開啟,這樣一來就產生了許多麻煩。(你可能想說記事本開啟檔案時並沒有讓選編碼?不妨先開啟記事本再使用檔案 -> 開啟看看)而UTF則引入了BOM來表示自身編碼,如果一開始讀入的幾個位元組是其中之一,則代表接下來要讀取的文字使用的編碼是相應的編碼:
BOM_UTF8 ‘\xef\xbb\xbf’
BOM_UTF16_LE ‘\xff\xfe’
BOM_UTF16_BE ‘\xfe\xff’
並不是所有的編輯器都會寫入BOM,但即使沒有BOM,Unicode還是可以讀取的,只是像MBCS的編碼一樣,需要另行指定具體的編碼,否則解碼將會失敗。
你可能聽說過UTF-8不需要BOM,這種說法是不對的,只是絕大多數編輯器在沒有BOM時都是以UTF-8作為預設編碼讀取。即使是儲存時預設使用ANSI(MBCS)的記事本,在讀取檔案時也是先使用UTF-8測試編碼,如果可以成功解碼,則使用UTF-8解碼。記事本這個彆扭的做法造成了一個 BUG:如果你新建文字檔案並輸入”奼塧”然後使用ANSI(MBCS)儲存,再開啟就會變成”漢a”,你不妨試試 :)
字元基礎 – ASCII, DBCS, Unicode
所有的 string 類都是以C-style字串為基礎的。C-style 字串是字元陣列。所以我們先介紹字元型別。這裡有3種編碼模式對應3種字元型別。第一種編碼型別是單子節字符集(single-byte character set or SBCS)。在這種編碼模式下,所有的字元都只用一個位元組表示。ASCII是SBCS。一個位元組表示的0用來標誌SBCS字串的結束。
第二種編碼模式是多位元組字符集(multi-byte character set or MBCS)。一個MBCS編碼包含一些一個位元組長的字元,而另一些字元大於一個位元組的長度。用在Windows裡的MBCS包含兩種字元型別,單位元組字元(single-byte characters)和雙位元組字元(double-byte characters)。由於Windows裡使用的多位元組字元絕大部分是兩個位元組長,所以MBCS常被用DBCS代替。
在DBCS編碼模式中,一些特定的值被保留用來表明他們是雙位元組字元的一部分。例如,在Shift-JIS編碼中(一個常用的日文編碼模式),0x81-0x9f之間和 0xe0-oxfc之間的值表示 “這是一個雙位元組字元,下一個子節是這個字元的一部分。 “這樣的值被稱作 “leading bytes “,他們都大於0x7f。跟隨在一個leading byte子節後面的位元組被稱作 “trail byte “。在DBCS中,trail byte可以是任意非0值。像SBCS一樣,DBCS字串的結束標誌也是一個單位元組表示的0。
第三種編碼模式是Unicode。Unicode是一種所有的字元都使用兩個位元組編碼的編碼模式。Unicode字元有時也被稱作寬字元,因為它比單子節字元寬(使用了更多的儲存空間)。注意,Unicode不能被看作MBCS。MBCS的獨特之處在於它的字元使用不同長度的位元組編碼。Unicode字串使用兩個位元組表示的0作為它的結束標誌。
單位元組字元包含拉丁文字母表,accented characters及ASCII標準和DOS作業系統定義的圖形字元。雙位元組字元被用來表示東亞及中東的語言。Unicode被用在COM及Windows NT作業系統內部。
你一定已經很熟悉單位元組字元。當你使用char時,你處理的是單位元組字元。雙位元組字元也用char型別來進行操作(這是我們將會看到的關於雙子節字元的很多奇怪的地方之一)。Unicode字元用wchar_t來表示。Unicode字元和字串常量用字首L來表示。
轉載: https://blog.csdn.net/tinyhell127/article/details/7530311