一, 为了编写编写符合aisi和unicode的应用程序,应该遵循以下原则:
1.将文本串视为字符数组,而不是chars数组或字节数组.
2.将通用数据类型(如TCHAR和PTSTR)用于文本字符和字符串.
3.将显示数据类型(如BYTE 和 PBYTE)用于字节,字节指针和数据缓存.
4.将TEXT宏用于原义字符和字符串.
5.执行全局性替换(例如用PTSTR替换PSTR).
6.修改字符串运算问题.例如函数通常希望你在字符中传递一个缓存的大小,而不是字节.这意味着你不应该传递sizeof(szbuffer),而应该传递(sizeof(szbuffer)/sizeof(tchar)).
二,确定文本是ansi文本还是unicode文本
IsTextUnicode函数能够帮助进行这种区分:
DWORD IsTextUnicode(CONST PVOID pvBuffer,int cb,PINT pResult);
isTextUnicode使用一系列统计方法和定性方法,以便猜测缓存的内容.由于这不是一个确切的科学方法,因此IsTextUnicode有可能返回不正确的结果.
第一个参数pvBuffer用语表使要测试的缓存地址.该数据是个无效指针,因为你不知道你拥有的是ansi字符数组还是unicode的字符数组.
第二个参数cb设定pvBuffer指向的字节数,同样,由于你不知道缓存中放的是什么,隐蔽cb是个字节数,而不是字符数.
第三个pResult是个证书的地址,必须在调用IsTextUnicode之前对他进行初始化,对该证书进行初始化后,就可以指明你要IsTextUnicode执行那些测试.也可以为该参数传递NULL,在这种情况下,IsTextUnicode将执行他能够进行的所有测试.
如果IsTextUnicode认为缓存中包含Unicode文本,将返回TRUE,否则将返回FALSE.
三,unicode 和ANSI之间的转换
int MultiByteToWideChar函数,原形如下:
int MultiByteToWideChar(UINT uCodePage,DWORD dwFlags,PCSTR pMultibyteStr,int cchMultiByte,
PWSTR pWideCharStr,int ccWideChar);
uCodePage参数用于标识一个与多字节字符串相关的代码页号.dwflags参数用于设定另一个控件,他可以用重音种类的区分来影响字符.这些标记通常并不使用,在dwflags参数中传递0.pmultibytestr参数用于要转换的字符串,ccbmultibyte参数用语指明该字符的长度.转换后产生的UNICODE字符串将被写入内存中的缓存,起地址由pWideCharStr参数指明.必须在cchwidechar参数设定该缓存的最大值.
函数 int WideCharToMultiByte(
UINT uCodePage,
DWORD dwFlags,
PCWSTR pWideChar,
int cchWideChar,
PSTR pMultiByteStr,
int cchMultiByte,
PCSTR pDefaultChar,
PBOOL pfUsedDefaultChar
);
参数说明与int MultiByteToWideChar大体相同.
1.将文本串视为字符数组,而不是chars数组或字节数组.
2.将通用数据类型(如TCHAR和PTSTR)用于文本字符和字符串.
3.将显示数据类型(如BYTE 和 PBYTE)用于字节,字节指针和数据缓存.
4.将TEXT宏用于原义字符和字符串.
5.执行全局性替换(例如用PTSTR替换PSTR).
6.修改字符串运算问题.例如函数通常希望你在字符中传递一个缓存的大小,而不是字节.这意味着你不应该传递sizeof(szbuffer),而应该传递(sizeof(szbuffer)/sizeof(tchar)).
二,确定文本是ansi文本还是unicode文本
IsTextUnicode函数能够帮助进行这种区分:
DWORD IsTextUnicode(CONST PVOID pvBuffer,int cb,PINT pResult);
isTextUnicode使用一系列统计方法和定性方法,以便猜测缓存的内容.由于这不是一个确切的科学方法,因此IsTextUnicode有可能返回不正确的结果.
第一个参数pvBuffer用语表使要测试的缓存地址.该数据是个无效指针,因为你不知道你拥有的是ansi字符数组还是unicode的字符数组.
第二个参数cb设定pvBuffer指向的字节数,同样,由于你不知道缓存中放的是什么,隐蔽cb是个字节数,而不是字符数.
第三个pResult是个证书的地址,必须在调用IsTextUnicode之前对他进行初始化,对该证书进行初始化后,就可以指明你要IsTextUnicode执行那些测试.也可以为该参数传递NULL,在这种情况下,IsTextUnicode将执行他能够进行的所有测试.
如果IsTextUnicode认为缓存中包含Unicode文本,将返回TRUE,否则将返回FALSE.
三,unicode 和ANSI之间的转换
int MultiByteToWideChar函数,原形如下:
int MultiByteToWideChar(UINT uCodePage,DWORD dwFlags,PCSTR pMultibyteStr,int cchMultiByte,
PWSTR pWideCharStr,int ccWideChar);
uCodePage参数用于标识一个与多字节字符串相关的代码页号.dwflags参数用于设定另一个控件,他可以用重音种类的区分来影响字符.这些标记通常并不使用,在dwflags参数中传递0.pmultibytestr参数用于要转换的字符串,ccbmultibyte参数用语指明该字符的长度.转换后产生的UNICODE字符串将被写入内存中的缓存,起地址由pWideCharStr参数指明.必须在cchwidechar参数设定该缓存的最大值.
函数 int WideCharToMultiByte(
UINT uCodePage,
DWORD dwFlags,
PCWSTR pWideChar,
int cchWideChar,
PSTR pMultiByteStr,
int cchMultiByte,
PCSTR pDefaultChar,
PBOOL pfUsedDefaultChar
);
参数说明与int MultiByteToWideChar大体相同.