您的位置:首页 > 其它

ANSI,Unicode;char,wchar_t, TCHAR;LPSTR, LPWSTR总结

2013-05-27 13:41 495 查看
 摘要:

本文总结对比了ANSI/Unicode,char/wchar_t,LPSTR/LPWSTR。

简单描述了char, wchar_t,  TCHAR的初始化,操作函数,输出的方法。

 数据类型操作初始化输出WinLP
ANSIcharstr(strcpy)"char"printfLPSTR
Unicodewchar_twcs(wcscpy)L"char"wprintfLPWSTR
通用TCHAR_tcs(_tcscpy)_T("char")_tprintf 


1. ANSI和Unicode

ANSI :单字节表示字符(8位),主要是拉丁语系

Unicode:双字节表示字符(16位),汉语等

    (1) 可以很容易地在不同语言之间进行数据交换。

    (2) 使你能够分配支持所有语言的单个二进制.exe文件或DLL文件。

    (3) 提高应用程序的运行效率。

2. char 和 wchar_t

ANSI
"char";
UNICODE
L"char";
ANSI/UNICODE_T("char") or _TEXT("char");

3. WinLP

LP:代表长指针    C:代表常量   STR:代表字符串

char* replacement: 
LPSTR

const char* replacement: 
LPCSTR

WCHAR* replacement: 
LPWSTR

const WCHAR* replacement: 
LPCWSTR
 (C before W,since 
const
 is
before 
WCHAR
)
TCHAR* replacement: 
LPTSTR

const TCHAR* replacement: 
LPCTSTR

// #include <winnt.h>

typedef CHAR char;

typedef WCHAR wchar_t;

#ifdef  UNICODE                    // r_winnt

typedef WCHAR TCHAR, *PTCHAR;

typedef WCHAR *LPWSTR;

typedef LPWSTR LPTSTR;

typedef CONST WCHAR *LPCWSTR;

typedef LPCWSTR LPCTSTR;

#define __TEXT(quote) L##quote  // r_winnt

#else   /* UNICODE */             // r_winnt

typedef CHAR TCHAR, *PTCHAR;

typedef CHAR *LPSTR;

typedef LPSTR LPTSTR;

typedef CONST CHAR *LPCSTR,

typedef LPCSTR LPCTSTR;

#define __TEXT(quote) quote

#endif /* UNICODE */             // r_winnt

#define TEXT(quote) __TEXT(quote)   // r_winnt


4. 操作

    双字节(DBCS)字符集中,字符串的每个字符可以包含一个或两个字节。如果只是调用strlen()函数,那么你就无法知道字符串到底有多少个字符,它只能告诉你到达结尾的0之前有多少个字节。

   标准c中的strcpy,strchr,strcat等只能用于ANSI字符串,不能正确处理UNICODE字符串,因此也提供了一组补充函数,功能等价,但用于UNICODE码。我们来看看string .h字符串头文件中是怎样处理char*和wchar_t*两个字符串版本的:

// …/Microsoft Visual Studio 8/VC/include/string.h

char *strcat(char*,constchar*);
wchar_t *wcschr(wchar_t*,constwchar_t*);

strlen/wcslen、strcpy/wcscpy、strncpy/wcsncpy、strcat/wcscat、strncat/wcsncat、strcmp/wcscmp、strncmp/wcsncmp、strchr/wcschr、strrchr/wcsrchr、strstr/wcsstr、sprintf/swprintf、strtol/wcstol、strtoul/wcstoul;

   类似的还有strchr/wcschr,strcmp/wcscmp,strlen/wcslen etc. ANSI 操作函数以str开头 strcpy ,UNICODE 操作函数以wcs开头 wcscpy。

MBCS 操作函数以_mbs开头 _mbscpy

ANSI/UNICODE 操作函数以_tcs开头 _tcscpy(C运行期库)

                                                    lstr开头 lstrcpy(Windows API-KERNEL32.DLL)

                                                    lstrlen(lstrlenA/lstrlenW)、lstrcpy(lstrcpyA/lstrcpyW)、lstrcpyn(lstrcpynA/lstrcpynW)、lstrcat(lstrcatA/lstrcatW)、lstrcmp(lstrcmpA/lstrcmpW)、lstrcmpi(lstrcmpiA/lstrcmpiW)


WINBASEAPI

LPSTR

WINAPI

lstrcpyA(

__out LPSTR lpString1,

__in  LPCSTR lpString2

);

WINBASEAPI

LPWSTR

WINAPI

lstrcpyW(

__out LPWSTR lpString1,

__in  LPCWSTR lpString2

);

#ifdef UNICODE

#define lstrcpy  lstrcpyW

#else

#define lstrcpy  lstrcpyA

#endif // !UNICODE


   所有新的和未过时的函数在Windows2000中都同时拥有ANSI和UNICODE两个版本。ANSI版本函数结尾以A表示;UNICODE版本函数结尾以W表示。操作系统根据是否定义了UNICODE宏来调用合适版本的API。

5. 初始化

ANSI:

char *str =  "char";

UNICODE :

wchar_t* wstr = L"char";

ANSI/UNICODE :

TCHAR* tstr = _T("char") ;

TCHAR* tstr = _TEXT("char");


6. 输出

ANSI:
printf("char");
Unicode:
wprintf(L"char");
通用:
_tprintf(_T("char"));


7. 字符数和字节数

对于ANSI来说:字符数 = 字节数

对于Unicode来说:字符数 = 2 * 字节数

strlen, wcslen or _tcslen  返回的是字符数

sizeof( TCHAR )  返回的是字节数

pBuffer = (TCHAR*) malloc (128 * sizeof(TCHAR) );


8. 参考

(1)http://blog.csdn.net/phunxm/article/details/5082618

(2)http://blog.csdn.net/xiyanlgu/article/details/8978875
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: