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       
);

posted on 2012-02-20 10:48  多个马甲  阅读(267)  评论(0编辑  收藏  举报