記錄製作MFC項目遇到的問題

1.字符編碼問題

      爲了程序的簡易與快速開發,以後都選擇Unicode作爲工程的字符集。

轉載於:https://www.cnblogs.com/gaohongchen01/p/4006700.html

多字節字符集:

  在最初的時候,Internet上只有一種字符集——ANSI的ASCII字符集,它使用7 bits來表示一個 字符,總共表示128個字符,其中包括了 英文字母、數字、標點符號等常用字符。之後,又進行擴展,使用8 bits表示一個字符,可以表示256個字符,主要在原來的7 bits字符集的基礎上加入了一些特殊符號。後來,由於各國語言的加入,ASCII已經不能滿足信息交流的需要,爲了能夠表示其它國家的文字,各國在 ASCII的基礎上制定了自己的字符集,這些從ANSI標準派生的字符集被習慣的統稱爲ANSI字符集,它們正式的名稱應該是MBCS(Multi-Byte Chactacter System,即多字節字符系統)。這些派生字符集的特點是以ASCII 127 bits爲基礎,兼容ASCII 127,他們使用大於128的編碼作爲一個Leading Byte,緊跟在Leading Byte後的第二(甚至第三)個字符與 Leading Byte一起作爲實際的編碼。這樣的字符集有很多,我們常見的GB-2312就是其中之一。

Unicode字符集:

  Unicode的學名 是"Universal Multiple-Octet Coded Character Set",簡稱爲UCS。UCS可以看作是"Unicode Character Set"的縮寫。UCS只是規定如何編碼,並沒有規定如何傳輸、保存這個編碼。UTF是“UCS Transformation Format”的縮寫。

  Unicode字符集有多種編碼形式,它固定使用16 bits(兩個字節、一個字)來表示一個字符,共可以表示65536個字符。將世界上幾乎所有語言的常用字符收錄其中,方便了信息交流。標準的Unicode稱爲UTF-16。後來爲了雙字節的Unicode能夠在現存的處理單字節的系統上正確傳輸,出現了UTF-8(注意UTF-8是編碼,它屬於Unicode字符集),使用類似MBCS的方式對Unicode進行編碼。UTF-8以字節爲編碼單元,沒有字節序的問題。UTF-16以兩個字節爲編碼單元。

  UTF-16包括三種:UTF-16,UTF-16BE(Big Endian),UTF-16LE(Little Endian),UTF-16需要通過在文件開頭以名爲BOM(Byte Order Mark)的字符來表明文件是Big Endian還是Little Endian。Unicode規範中推薦的標記字節順序的方法是BOM(Byte Order Mark)。在UCS編碼中有一個叫做"ZERO WIDTH NO-BREAK SPACE"的字符,它的編碼是FEFF。而FFFE在UCS中是不存在的字符,所以不應該出現在實際傳輸中。UCS規範建議我們在傳輸字節流前,先傳輸字符"ZERO WIDTH NO-BREAK SPACE"。這樣如果接收者收到FEFF,就表明這個字節流是Big-Endian的;如果收到FFFE,就表明這個字節流是Little-Endian的。因此字符"ZERO WIDTH NO-BREAK SPACE"又被稱作BOM。

  UTF-8不需要BOM來表明字節順序,但可以用BOM來表明編碼方式。字符"ZERO WIDTH NO-BREAK SPACE"的UTF-8編碼是EF BB BF(讀者可以用我們前面介紹的編碼方法驗證一下)。所以如果接收者收到以EF BB BF開頭的字節流,就知道這是UTF-8編碼了。

  Windows就是使用BOM來標記文本文件的編碼方式的。

  L是用來標誌一個字符(串)爲寬字符(串),當你在VS2005以上版本的IDE工作時,可以選擇工作於這兩種不同的編碼方式下,而在Unicode方式下,則要對字符(串)常量前添加L來告訴編譯器它是寬字符。MS爲我們定義了好幾個相關的宏:_T(定義於tchar.h)、_TEXT(同樣定義於tchar.h)。

  TEXt():如果定義了Unicode,標識字符爲Unicode;否則,爲ANSI字符集。在VS2010使用Unicode字符集下:

  對於爲什麼使用Unicode?(以下引自《windows核心編程》)
  開發應用程序的時候,強烈建議你使用Unicode字符和字符串,理由如下:

  • Unicode使程序的本地化變得更容易;
  • 使用Unicode,只需發佈一個二進制(.exe或DLL)文件,即可支持所有語言;
  • Unicode代碼執行速度更快,佔用內存更少,提升了應用程序的效率。自從Windows2K開始,Win的系統內核開始完全支持並完全應用Unicode編寫,所有ANSI字符在進入底層前,都會被相應的API轉換成Unicode。所以,如果你一開始就使用Unicode,則可以減少轉換的用時和RAM開銷。
  • 使用Unicode,你的應用程序能輕鬆調用所有不反對使用(nondeprecated)的Windows函數,因爲一些Windows函數提供了只能處理Unicode字符和字符串的版本;
  • 使用Unicode,你的代碼很容易與COM集成(後者要求使用Unicode字符和字符串);
  • 使用Unicode,你的代碼很容易與.NET Framework集成(後者要要求使用Unicode字符和字符串);
  • 使用Unicode,能保證你的代碼能夠輕鬆操縱你自己的資源(其中的字符串總是Unicode的);
  • 世界上大多數程序用的字符集都是Unicode,因爲Unicode有利於程序國際化和標準化;

應此,經過試驗,在Windows編程中不要使用多級多字節字集,使用Unicode,並且不要使用char,使用wchar_t,而相應的字符操作如strcpy只要將潛在前綴str變成wcs就可以相同的操作wchar_t。

 

2.dll製作

首先要先明白dll與lib的聯繫區別。lib文件中包含的是函數的地址,而函數的實現在dll中,lib相當於.h文件,在編譯的時候使用lib文件能夠方便的使用dll中的函數,而不用動態的加載dll(LoadLibrary("xxx.dll")),雖然可以直接使用dll不用lib。而VS生成dll時默認不生成lib,要生成lib就需要添加邊需要在邊界工程的def文件。先在項目中設置生成map映射文件,在從該map文件中將要生成的函數添加到def文件下的EXPORTS下。再次生成就可以看到lib文件,並且是要添加相關聲明定義的.h文件,再使用一下語句就可以調用函數或類。

#pragma comment(lib,"..\\DeBug\\CRapidFinder.lib")

具體參照:

https://blog.csdn.net/cbacq/article/details/51247694

http://blog.sina.com.cn/s/blog_81c6474c01015x1a.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章