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的庫。其實,我在之前也有...