Windows编程 - 02 - ANSI和Unicode字符处理
时间:2010-09-09 来源:小风_ks
0. 为什么要使用Unicode
- 简化本地化工作
- 发布一个exe或DLL就可以支持所有语言
- 高效率:Windows内部都使用Unicode处理字符
- 很容易的与COM, .Net Framework整合
1. Unicode编码
Unicode is a standard founded by Apple and Xerox in 1988.
Unicode的几种编码方式
UTF-8:有的字符1字节(小于0x0080, USA), 有的2字节(0x0080 and 0x07FF, Euro),有的3字节(大于0x0800), 还有一些4字节
UTF-16 所有字符都是2字节, 缺点就是不能包含所有字符,但是已经够用
UTF-32 所有字符都是4字节
2. ANSI和Unicode字符类型
char
wchar_t
一些windows定义的类型和宏, 我们在编写代码时就要使用 TCHAR, *PTCHAR, PTSTR 这几种类型
#ifdef UNICODE
typedef WCHAR TCHAR, *PTCHAR, PTSTR;
typedef CONST WCHAR *PCTSTR;
#define __TEXT(quote) quote // r_winnt
#define __TEXT(quote) L##quote
#else
typedef CHAR TCHAR, *PTCHAR, PTSTR;
typedef CONST CHAR *PCTSTR;
#define __TEXT(quote) quote
#endif
#define TEXT(quote) __TEXT(quote)
3. ANSI和Unicode windows函数
一般情况下Windows都会有如下三个名字的函数
CreateWindowEx
CreateWindowExW
CreateWindowExA
#ifdef UNICODE
#define CreateWindowEx CreateWindowExW
#else
#define CreateWindowEx CreateWindowExA
#endif
C runtime library Unicode函数和新名字
#ifdef _UNICODE
#define _tcslen wcslen
#else
#define _tcslen strlen
#endif
4. Windows安全函数
在函数名后面加上”_s”
_tcscpy_s
_tcscat_s
5. ANSI 和Unicode函数之间的转换
相关函数
int MultiByteToWideChar(
UINT uCodePage,
DWORD dwFlags,
PCSTR pMultiByteStr,
int cbMultiByte,
PWSTR pWideCharStr,
int cchWideChar);
int WideCharToMultiByte(
UINT uCodePage,
DWORD dwFlags,
PCWSTR pWideCharStr,
int cchWideChar,
PSTR pMultiByteStr,
int cbMultiByte,
PCSTR pDefaultChar,
PBOOL pfUsedDefaultChar);
BOOL IsTextUnicode(CONST PVOID pvBuffer, int cb, PINT pResult);
参考:
Windows via C/C++, Fifth Edition, Jeffrey Richter, Christophe Nasarre