Windows Unicode
所有的 Unicode 函数均已 wcs 开头
TChar.h 头文件 :
作用就是帮助创建 ANSI / Unicode 通用的源代码文件 , 它包含了用在源代码中的一组宏定义
例如 : _tcscpy 宏 , 如果在包含该头文件时没有定义 UNICODE ,那么 _tcscpy 会扩展为 ANSI 的 strcpy 函数 , 如果
定义了 UNICODE 那么就会扩展为 wcscpy 函数
拥有字符串参数的所有 C 运行期函数都在 TChar.h 文件中定义了一个通用宏
L"字符串" :
字符串前面加大写的字母 L , 用于告诉编译器该字符串应该作为 Unicode 字符串来编译 , 当编译器将字符串置于程序的数据部分中时
,会在每个字符之间分散插入零字节 . 这种变更带来的问题是 , 现在只有定义了 UNICODE 时,程序才能编译通过
_TEXT("字符串") :
有选择的是否按照 UNICODE 来编译字符串 , 根据是否定义了 UNICODE 来存储字符串 ,不会跟 L 一样 , 都分散插入 零字节
Unicode 数据类型 :
WCHAR Unicode字符
PWSTR 指向 Unicode 字符串的指针
PCWSTR 指向一个恒定的 Unicode 字符串指针
这些数据类型是值 Unicode 字符 和 字符串 , Windows 头文件也定义了 ANSI / Unicode 通用的数据类型 PTSTR 和 CTSTR
成为符号 ANSI 和 Unicode 的应用程序基本原则:
1 将文本串视为字符数组 , 而不是 chars 数组或字节数组
2 将通用数据类型 (如 TCHAR 和 PTSTR) 用于文本字符和字符串
3 将显示数据类型 (如 BYTE 和 PBYTE) 用于字节 , 字节指针 和 数据缓存
4 将 TEXT 宏用于原义字符 和 字符串
5 执行全局性替换 (例如用 PTSTR 替换 PSTR)
6 修改字符串运算问题 . 例如函数通常希望你在字符中传递一个缓存的大小 , 而不是字节 . 这就意味着你不应该传递 sizeof(szBuffer) ,
而是应该传递 (sizeof(szBuffer)/sizeof(TCHAR)) . 另外 , 如果需要为字符串分配一个内存块 , 并且拥有该字符串中的字符数目 ,
那么请记住要按字节来分配内存 , 也就是说应该调用 malloc(nCharacters * sizeof(TCHAR)) 而不是 malloc(nCharacters)
对 Unicode 字符串进行操作的函数 :
lstrcat 将一个字符串置于另一个字符串的结尾处
lstrcmp 对两个字符串进行区分大小写的比较
lstrcmpi 对两个字符串进行不区分大小写的比较
lstrcpy 将一个字符串拷贝到内存中的另一个位置
lstrlen 返回字符串的长度 (按字符数来计量)
这些函数是作为宏来实现的 , 这些宏既可以调用函数的 Unicode 版本 , 也可以调用 ANSI 版本
CompareString 函数 :
int CompartString(
LCID lcid, //本机使用的 语言 ID LCID = GetThreadLocal(); 函数可以获取本机使用的语言 ID
// NORM_IGNORECASE 忽略字母的大小写
// NORM_IGNOREKANATYPE 不区分平假名与片假字符
// NORE_IGNORENONSPACE 忽略无间隔字符
// NORE_IGNORESYMBOLS 忽略符号
// NORM_IGNOREWIDTH 不区分单字节字符与作为双字节字符的同一个字符
// SORT_STRINGSORT 将标点符号作为普通符号来处理
DWORD fdwStyle, //标志用来修改该函数比较两个字符串所用的方法
PCWSTR pString1, //要比较的字符串 1
int cch1, //要比较字符串 1 的长度 , 如果为 -1 表名字符串1 以 0 结尾 ,函数会自动计算字符串 1 的长度
PCWSTR pString1, //要比较的字符串 2
int cch1, //要比较字符串 2 的长度 , 如果为 -1 表名字符串2 以 0 结尾 ,函数会自动计算字符串 2 的长度
)
Unicode 字符的串大小写字母:
PTSTR CharLower(PTSTR pszString); //转换成小写字母
PTSTR CharUpper(PTSTR pszString); //转换成大写字母
// Unicode 转换 缓存中包含的字符 , 该缓存不必以 0 结尾
DWORD CharLowerBuff(PTSTR pszString,DWORD cchString);
DWORD CharUpperBuff(PTSTR pszString,DWORD cchString);
C 与 Unicode 函数
isalpha IsCharAlpha(TCHAR ch); //如果参数是字母字符,函数返回非零值,否则返回零值。
IsCharAlphaNumber(TCHAR ch); //如果参数是数字,函数返回非零值,否则返回零值。
islower IsCharLower(TCHAR ch); //如果参数是小写字母,函数返回非零值,否则返回零值。
isupper IsCharUpper(TCHAR ch); //如果参数是大写字母,函数返回非零值,否则返回零值。
判断文本是 ANSI 还是 Unicode
//pvBuffer 用于标识要测试的缓存的地址
//cb 用于设定 pvBuffer 指向的字节数
//pResult 是个整数的地址
DWORD IsTextUnicode(CONST PVOID pvBuffer, int cb , PINT pResult);
//用于将宽字符串转换成多字节字符串
int WideCharToMultiByte(
UINT CodePage,
DWORD dwFlags,
LPCWSTR lpWideCharStr,
int cchWideChar,
LPSTR lpMultiByteStr,
int cbMultiByte,
LPCSTR lpDefaultChar,
LPBOOL lpUsedDefaultChar
);
//用于将多字节字符串转换成宽字符串
int MultiByteToWideChar(
UINT CodePage,
DWORD dwFlags,
LPCSTR lpMultiByteStr,
int cbMultiByte,
LPWSTR lpWideCharStr,
int cchWideChar
);