Unicode 和Ansi下的字符和字符串转换问题
一、Unicode
通常,有以下三种方式定义字符和字符串
- ANSI字符和字符串
- Unicode字符和字符串
- 双模式字符和字符串
1.ANSI字符和字符串
在ANSI中使用单引号定义一个字符常量(如'a'),使用双引号定义字符串常量(如"Hello")。同样定义字符变量、字符数组或者字符指针,在C++程序中通常使用char或char*数据类型来定义。同时Win32 API还定义了CHAR和LPSTR数据类型来增强代码的可移植性。
在对ANSI字符串进行操作时,C++通常使用以下几个函数:
- strlen()-返回字符串的长度
- strcpy()-复制字符串
- strcat()-连接字符串
2.Unicode字符和字符串
Windows mobile下只支持Unicode字符和字符串,不支持ANSI字符和字符串。在Unicode编码中,所有字符的存储都占两个字节,在编程时使用“L”来创建一个Unicode字符或者字符串,,如L"H"表示常量Unicode字符,而L"Hello"表示一个常量Unicode字符串。
为了定义一个Unicode数据类型,通常使用WCHAR(或wchar_t)来定义一个Unicode字符变量或者字符数组,使用LPWSTR定义一个指向Unicode字符串的指针。
对Unicode字符串或字符进行操作的函数
- wcslen()-返回字符串的长度
- wcscpy()-复制字符串
- wcscat()-连接字符串 wcs代表 wide-character-string(宽字符串)
3.双模式字符和字符串
为了使字符和字符串可以适用于Unicode编码系统,也可以适用于ANSI编码的操作系统,可以将字符或字符串定义为双模式的。通常采用函数TEXT()或_T()宏,它们被定义于tchar.h头文件中。例如,TEXT("hello“)表示一个双模式的字符串,如果编译器发现定义_UNICODE预处理器符号那么TEXT("hello“)就被转换为L"Hello",否则被转换为"Hello".
双模式下对字符或字符串的操作函数
- tcslen()-返回字符串的长度
- tcscpy()-复制字符串
- tcscat()-连接字符串
二 Unicode转换
在Windows mobile下编程时,往往需要将一个多字节字符串转换为一个Unicode字符串或将一个Unicode字符串转换成一个多字节字符串。例如,在Windows mobile设备作为网络设备时,它需要接收来自网络不同远程计算机的数据或者向这些计算机发送数据,那么这些远程计算机所能处理的数据不一定就是Unicode编码的数据,因此就必须涉及Unicode与其他字符串的转换。
1.转换为Unicode
mbstowcs函数将一个多字节字符串转换成一个宽字符串,或者将一个非Unicode字符串转换为一个Unicode字符串。函数原型:
size_t mbstowcs(
wchar_t *wcstr, //输出字符串
const char *mbstr, //输入字符串
size_t count ); //字符个数
举例:
WCHAR* wchOut[256]; //接收函数输出的缓冲区
LPSTR pstr="Hello world"; ///要转换的字符串
mbstowcs(wchOut,pstr,strlen(pstr));
2.从Unicode转换
函数原型:
size_t wcstombs( char *mbstr, const wchar_t *wcstr, size_t count );
举例:
CHAR mbsOut[256];
LPWSTR pwchIn=L"A Unicode String";
wcstombs(mbsOut, pwchIn, wcslen(pwchIn));