最近研究vc,windows的東西真是很傻瓜,啥都給你做好,有個好處就是開發方便了。
有個弊端就是完全按微軟的一套進行,規則都是它定的,你得知道它的很多api,
開發出來的代碼效率不高,不過卻可以比較快的實現一些較好的功能,其實軟件開發就應該這樣
要不每個程序員都從0開始做起,那都停留在Hello層次了。其實微軟的弊端主要體現在后台的封裝,
開發者無法知道它的api的實現方式;或許某天微軟掛了,無數程序員就得上街賣唱乞討了,
不過軟件行業老大微軟可不是那么容易掛的。
vc中字符處理是一個比較重要的部分,很多初學者對這個都頭痛。
某網友寫的關於vc字符集的,看了下還不錯,轉過來有空看看。
來源:
http://blog.csdn.net/phylh/archive/2009/01/21/3847030.aspx
系統環境
操作系統 Windows XP
本地字符集(MBCS) GBK
編譯器: VC8、VC6、DEV-C++(gcc)
實驗字符
‘我’
GBK 字符編碼 0xD2CE
UNICODE 字符編碼 0x6211
‘a’
GBK 字符編碼 0x61
UNICODE 字符編碼 0x0061
A-源代碼層面
VC8
1. 文件首兩個字節為 0xFF 0xFE(文本文件開頭幾個字節標識了源文件使用的字符集,開頭為0xFF 0xFE表示使用的是UNICODE字符集),所以源文件以UNICODE方式保存,‘我’字符編碼為0x6211,‘a’字符編碼為0x0061;
VC6
1. 使用本地字符集GBK保存源程序,‘我’字符編碼為0xD2CE,‘a’字符編碼為0x0061;
DEV-C++(gcc)
1. 使用本地字符集GBK保存源程序,‘我’字符編碼為0xD2CE,‘a’字符編碼為0x0061;
B-可執行程序層面(源程序字符集->可執行程序字符集)
VC8
1. VC8編譯器默認的程序字符集是本地字符集GBK。
2. 編譯參數#pragma setlocale(LOC)告訴編譯器源代碼字符集為LOC,如果不設置則為UNICODE。
3. 如果字符字面量前有L(L”我”,L”a”),並且設置了編譯參數#pragma setlocale(LOC),那么編譯時將發生LOC->UNICODE字符集的轉換;假如沒有設置則發生源代碼字符集UNICODE->UNICODE的轉換(相當於不發生轉換),’我’的編碼是0x6211,’a’的編碼是0x0061。
4. 如果字符字面量前沒有L,編譯時發生源代碼字符集UNICODE->本地字符集GBK編碼的轉換,’我’的編碼是0xD2CE,’a’的編碼是0x61。
VC6
1. VC6編譯器默認的程序字符集是本地字符集GBK。
2. 編譯參數#pragma setlocale(LOC)告訴編譯器源代碼字符集為LOC,如果不設置則為系統默認字符集GBK。
3. 如果字符字面量前有L(L”我”,L”a”),並且設置了編譯參數#pragma setlocale(LOC),那么編譯時將發生LOC->UNICODE字符集的轉換;假如沒有設置則發生源代碼字符集本地GBK->UNICODE的轉換,’我’的編碼是0x6211,’a’的編碼是0x0061。
4. 其它情況都不發生任何的字符集編碼轉換(源程序字符集和程序字符集一致),使用本地字符集GBK編碼’,我’的編碼是0xD2CE,’a’的編碼是0x61。
DEV-C++(gcc)
1. DEV-C++(gcc)編譯器默認的程序字符集是UTF-8。
2. #pragma setlocale對編譯沒有影響。
3. 如果字符字面量前有L(L”我”,L”a”),那么編譯時將把字符字面量從配置字符編碼GBK轉換為UNICODE字符編碼(L開頭的字符字面量都是使用UNICODE字符編碼),’我’的編碼是0x6211,’a’的編碼是0x0061。注:編譯器參數為-finput-charset=GBK(指定源程序字符集為GBK,如果不指定編譯器默認源程序字符集為UTF-8)。
4. 其它情況會發生編譯器配置參數GBK->UTF-8字符集的轉換,’我’的編碼是0x9E88E6,’a’的編碼是0x61。這種情況下使用printf打印的時候會出現亂碼,由於本地字符集是GBK,但實際字符編碼是UTF-8,解決方法是在程序中把UTF-8轉換為本地字符集GBK然后再調用printf打印。
5. 在RH Linux系統下直接調用printf打印不會出問題,因為在該系統下默認字符集是UTF-8和編譯器默認字符集一致,所以沒有出現亂碼問題。
C-WindowsAPI層面
VC8
1. 如果編譯參數配置了UNICODE則API被解釋為調用UNICODE版本的API(帶標記W的API,這里W代表UNICODE字符的含義)。
2. 如果編譯參數沒有配置UNICODE則API被解釋為調用單字符編碼版本的API(帶標記A的API)。
VC6
同VC8。
DEV-C++(gcc)
同VC8。
D-雜項&總結
1. VC中UNICODE編譯參數只控制windows API的展開,是UNICODE方式(W標記,這里W代表UNICODE字符的含義)還是單字符方式(A標記),其它不做控制。
2. C++中字符字面量前面如果有標識L,程序運行時這個字符字面量一定UNICODE字符編碼方式的寬字符(不是其它字符編碼方式)。
3. C++中如果字符字面量前面沒有標識L,那么程序運行時這個字符字面量一定是編譯器默認字符集編碼方式(VC中是GBK字符集,’我’的編碼是0xD2CE,’a’的編碼是0x61,DEV-C++中是UTF-8, ’我’的編碼是0x9E88E6,’a’的編碼是0x61)。
4. C++中wchar_t,代表寬字符(UNICODE字符只是寬字符的一種),任何寬字符都可以賦值給wchar_t,包括UNICODE字符和其它寬字符(比如GBK編碼的漢字字符),所以理論上wchar_t字符僅僅只代表是寬字符,不代表一定是UNICODE字符(不過一般情況下C++實現都使用UNICODE字符)。