Windows中的寬字串處理問題

2021-07-04 22:49:01 字數 1594 閱讀 6244

在用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 ,所以使用_tmain()的時候必須使用#include,在標頭檔案裡找到_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 字串處理

舉例說明其基本功能 echo off set ifo abcdefghijklmnopqrstuvwxyz0123456789 echo 原字串 第二行為各字元的序號 echo ifo echo 123456789012345678901234567890123456 echo 擷取前5個字元 ec...

多位元組字串轉寬位元組字串(windows)

windows函式 multibytetowidechar提供將多位元組字串轉換為寬位元組字串的功能 參考windows核心程式設計2.8 int multibytetowidechar uint ucodepage,dword dwflags,pcstr pmultibytestr,int cbm...

寬字元和普通字串處理函式

字元分類 寬字元函式普通c函式描述 iswalnum isalnum 測試字元是否為數字或字母 iswalpha isalpha 測試字元是否是字母 iswcntrl iscntrl 測試字元是否是控制符 iswdigit isdigit 測試字元是否為數字 iswgraph isgraph 測試字...