Windows中的寬字元串處理問題

來源:互聯網
上載者:User

標籤:寬字元串   unicode   ansi   

在用VC做開發的時候,對於一些字串,會經常調用一般_t、_T、T(),其實這些東西都和Unicode有關係。比如說,AfxMessageBox(_T("Error! Fail to connect the database!"));這裡用到了一個_T(),不使用_T()有時候編譯會報錯。

Windows作業系統使用Unicode作為預設的文本編碼格式。Unicode定義了對大於8位的字元編碼的支援。Windows使用UTF-16格式,稱為寬字元編碼,UTF-16編碼以16位不帶正負號的整數為單位,每個字元佔用兩個位元組。許多Windows函數都定義了兩個進入點Unicode版本入口函數以W字元結尾,表示的是針對寬字元的;ANSI字元進入點函數則以A結尾。比如說,對於CreateMutex()存在CreateMutexW()和CreateMutexA()。編譯的時候根據是否定義了Unicode進行適當的函數調用。Windows內部使用的是寬字元,ANSI進入點實際上只是在寬字元版本函數調用之外加上封裝,進行適當的字串轉換。

16位字元類型為wchar_t,可以代替char類型。WCHAR是定義寬字元的等價形式,在原始碼中字串都被解釋成8位的ANSI字元,所以需要將其指定為寬字元,可以使用L說明符或者宏TEXT()來指定。

wchar_t str1[]=L”some text”;WCHAR st2[]=TEXT(“moretext”);

在定義了Unicode的情況下,TEXT()宏很有用,它會將字串轉換為寬字元格式;在未定義Unicode的情況下,它讓字串保留8位ANSI文本格式。TCHAR類型與之類似,定義了Unicode時,解析為wchar_t,否則解析成char。

有些函數也會根據是否定義了Unicode而採用不同的解析方式的宏。比如說,主函數_tmain()在定義UNICODE的情況下,解析為wmain(),否則解析為main();_tprintf()在定義了Unicode的情況下解析為wprintf(),否則解析成printf()。

其實在使用_tmain的時候,利用Goto Definition可以看到,在stdafx.h裡面有這麼一行,#include <tchar.h>,所以使用_tmain()的時候必須使用#include<tchar.h>,在標頭檔<tchar.h>裡找到_tmain的宏定義,

#define _tmain         main

經過先行編譯以後,_tmain就變成main了。main()是標準C++的函數入口。標準C++的程式進入點函數,預設字元編碼格式ANSI函數原型為:

int main();

int main(int argc, char* argv[]);

_tmain()是windows提供的對Unicode字元集和ANSI字元集進行自動轉換用的程式進入點函數,其原型為int _tmain(int argc, TCHAR *argv[])。

當程式當前的字元集為Unicode時,int _tmain(int argc, TCHAR *argv[])會被翻譯成

int wmain(int argc, wchar_t *argv[]);當程式當前的字元集為ANSI時,int_tmain(int argc, TCHAR *argv[])會被翻譯成int main(int argc, char *argv[])。

著作權聲明:本文為博主原創文章,未經博主允許不得轉載。

Windows中的寬字元串處理問題

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.