Unicode程式設計

2021-06-25 13:31:18 字數 4445 閱讀 2730

1.

windows

定義的unicode

資料型別有哪些?

資料型別 說明

wchar unicode字元(源自系統巨集定義typedef

wchar_t

wchar;)

pwstr 指向unicode字串的指標

pcwstr 指向乙個恆定的unicode字串的指標

對應的ansi資料型別為char,lpstr和lpcstr。 (

lpctstr

和const tchar*

是完全等同的。其中l表示

long

指標,p

(pointer

)表示這是乙個指標;c

(const

)表示是乙個常量

;t(_t巨集)

表示相容

ansi

和unicode

,str

(string

)表示這個變數是乙個字串

)win32 api在winnt.h標頭檔案中定義了一些實現字元和常量字串的巨集進行ansi/unicode通用程式設計。

ansi/unicode通用資料型別為tchar,ptstr,lpctstr。

#ifdefunicode // 注意此處沒有沒有下劃線

typedef wchar         tchar, *ptchar;

typedef lpwstr        lptch, ptch;

typedef lpwstr        ptstr, lptstr;

typedef lpcwstr       lpctstr;

#define __text(quote) l##quote        // r_winnt

#else                        // r_winnt

typedef char          tchar, *ptchar;

typedef lpstr         lptch, ptch;

typedef lpstr         ptstr, lptstr;

typedef lpcstr        lpctstr;

#define __text(quote) quote           // r_winnt

#endif                      // r_winnt

2.

如何編寫

unicode

源**?

只需要定義兩個巨集(unicode和 _unicode),就可以修改然後重新編譯該原始檔。

_unicode巨集用於c執行期標頭檔案,而unicode巨集則用於windows標頭檔案。當編譯源**模組時,通常必須同時定義這兩個巨集。

3.

如何對unicode

進行操作?

1. ansi操作函式:          以str開頭,如strcpy(),strcat(),strlen();

2. unicode操作函式:      以wcs開頭,如wcscpy,wcscpy(),wcslen();

3. ansi/unicode操作函式: 以_tcs開頭 _tcscpy(c執行期庫);

4. ansi/unicode操作函式: 以lstr開頭 lstrcpy(windows函式);

考慮ansi和unicode的相容,我們需要使用以_tcs開頭或lstr開頭的通用字串操作函式。

所有新的和未過時的函式在windows2000中都同時擁有ansi和unicode兩個版本。ansi版本函式結尾以a表示;unicode版本函式結尾以w表示。windows會如下定義:

#ifdef unicode

#define createwindowex createwindowexw

#else

#define createwindowex createwindowexa

#endif // !unicode

注意:使用函式

strlen

和wcslen

都是獲得的字串的長度,使用

sizeof()

可獲得耗用記憶體空間

4.

如何表示

unicode

字串常量?

字符集 例項

ansi 「string」

unicode l「string」

ansi/unicode t(「string」)或_text(「string」)if( szerror[0] == _text(『j』) )

5.

如何編寫符合

ansi

和unicode

的應用程式?

(1)將文字串視為字元陣列,而不是chars陣列或位元組陣列。

(2)將通用資料型別(如tchar和ptstr)用於文字字元和字串。

(3)將顯式資料型別(如byte和pbyte)用於位元組、位元組指標和資料快取。

(4)將text巨集用於原義字元和字串。

(5)執行全域性性替換(例如用ptstr替換pstr)。

6.

如何判斷乙個文字檔案是

ansi

還是unicode

判斷如果文字檔案的開頭兩個位元組是0xff和0xfe,那么就是unicode,否則是ansi。

7.

如何在unicode

與ansi

之間轉換字串?

windows函式multibytetowidechar用於將多位元組字串轉換成寬字串;函式widechartomultibyte將寬字串轉換成等價的多位元組字串。

另外兩個常用的函式(如果出現轉換漢文的話請使用setlocale(lc_all, "chs");):

size_t mbstowcs( wchar_t *wcstr, const char *mbstr, size_tcount);

size_t wcstombs( char *

mbstr, const wchar_t *wcstr, size_tcount);

示例程式:

void

c對話方塊測試dlg::onbnclickedbutton1()

multibytetowidechar(cp_acp,// ansi code page

0,     //

stext,  // mbcs

字串-1,    //

返回unicode字串包括'\0'的長度

pwtext, // unicode

字串陣列

dwnum); // unicode

字串陣列元素個數

::messageboxw(this->m_hwnd,pwtext,l

"顯示窄轉寬字串",mb_ok);

delete pwtext;

dwnum = widechartomultibyte(cp_oemcp,0,wtext,-1,null,0,null,false);

pstext = new

char[dwnum];

if (!pstext)

widechartomultibyte (cp_oemcp,0,wtext, -1,pstext,dwnum,null,false);

::messageboxa(this->m_hwnd,pstext,"

顯示寬轉窄字串",mb_ok);

delete pstext; }

8.

預設環境

在vc6中,預設使用mbcs編碼,即多位元組字元;而vc8、vc7預設的是unicode編碼,實際就是支援大於0x80的ascii碼。這樣,乙個中文字可以表示為2個位元組,gb2312就是這樣表示的。

檢測環境的**:

#ifndef

unicode

afxmessagebox(text("ascii"));

#else

afxmessagebox(text("unicode"));

#endif

9.其他知識點

字串前面加l表示該字串是unicode字串。

_t是乙個巨集,如果專案使用了unicode字符集(定義了unicode巨集),則自動在字串前面加上l,否則字串不變。因此,visual c++裡邊定義字串的時候,用_t來保證相容性。vc支援ascii和unicode兩種字元型別,用_t可以保證從ascii編碼型別轉換到unicode編碼型別的時候,程式不需要修改。

Unicode程式設計

網上找了一篇關於unicode程式設計設定方面的文件,感覺不錯,收藏了 1。unicod程式設計 新增uafxcw.lib檔案 乙個是debug版本的庫,乙個是release版本的庫uafxcw.lib 1 在project settings的link中加入uafxcw.lib 2 pragma c...

UNICODE 程式設計入門(3)

下面的這個例子使用 win32 api 函式和通用資料型別設定 c 盤的卷標。設定 c 盤的卷標 drvsvl.cpp include include void main 通過使用 tchar 資料型別,將這段 最上面的字元陣列宣告為兩個位元組的字元。text 巨集再次被用於字串常量 void ma...

跨平台UNICODE程式設計總結

這段時間在架構整個伺服器,雖然前段時間受到了5.12汶川8.0級大 的影響 深切悼念在此次大 中遇難的同胞們 但是,我的工作還是在不斷地向前推進著。為了讓我們的伺服器能夠跨平台 主要是windows與linux 且能支援世界上的各種語言,我寫了乙個跨平台的且支援unicode的庫。其實,我在之前也有...