1. L 显式指定字符串为宽字符类型
2. CString 会自适应ANSI和UNICODE. 比如CString strLine = _T("ANSI和UNICODE编码试验")
ANSI : strLine长度为21
UNICODE : strLine长度为16
由此还可知,ANSI下,CString的GetLength获取的是字节数。unicode下,GetLength获取的是字符个数。
照理说,GetLength应该获取字符个数,而不是字节个数,但在ANSI下,毕竟英文字符个数就是字节个数,GetLength这样处理也合理,但是在用在中文上的时候需要注意这点.
3. CString的Format中使用_T的方法,对整个字符串使用,而不是对单独某个格式化符号使用。
比如:
int len = strLine.GetLength();
CString s;
s.Format(_T("len : %d"), len);
4. ANSI下的字符串都是以’/0’来标识字符串尾的(Unicode字符串以“/0/0”结束)
5. ANSI C++语言里面根据_UNICODE(有下划线)定义与否,各宏分别展开为Unicode或ANSI字符,在Windows里面根据UNICODE(无下划线)定义与否,各宏分别展开为Unicode或ANSI字符。在没有定义UNICODE和_UNICODE时,所有函数和类型都默认使用ANSI的版本;在定义了UNICODE和_UNICODE之后,所有的MFC类和Windows API都变成了宽字节版本了。
6. LPCTSTR和const TCHAR*是完全等同的。其中L表示long指针,这是为了兼容Windows 3.1等16位操作系统遗留下来的,在Win32 中以及其它的32位操作系统中,long指针和near指针及far修饰符都是为了兼容的作用,没有实际意义。P(pointer)表示这是一个指针;C(const)表示是一个常量;T(_T宏)表示兼容ANSI和Unicode,STR(string)表示这个变量是一个字符串。综上可以看出,LPCTSTR表示一个指向常固定地址的可以根据一些宏定义改变语义的字符串。
7. MultiByteToWideChar,也许sim2lib参数如果是TCHAR就不需要这个函数了,因为现在是显式使用的char,这是显式指定为ANSI的。
人家原来的sim2lib本来是支持unicode的,因为其原型是int sim2lib(LPTSTR lpInName,LPTSTR lpOutName),LPTSTR就是兼容ANSI和UNICODE的。
而自己写的sim2lib是int sim2lib(char* lpInName,char* lpOutName),显式使用了char,自然不支持unicode.
8. atoi 的兼容版本是 _ttoi
9.字符串字面值被当做char类型
10. 对一个显示指定参数为char*类型的函数,使用CString作为参数是不允许的,因为此时CString是被解析为wchar_t的
11. 如果工程没有通过setting设置为UNICODE的,则会出现类似错误 UNICODEtoMBCS' : cannot convert parameter 1 from 'class CString' to 'const unsigned short *'
12. 在unicode中使用string
#ifdef _UNICODE
#define tstring wstring
#else
#define tstring string
#endif
13. wchar_t*转化为wstring,可以直接使用赋值
wchar_t szLine[32];
wstring strLine;
strLine = szLine;
14. 在unicode下使用string和stringstream
#ifdef _UNICODE
#define tstring wstring
#define tstringstream wstringstream
#else
#define tstring string
#define tstringstream stringstream
#endif
int num = 2;
tstring strNum;
tstringstream stream;
stream << num;
stream >> strNum;
tstring strCHN = _T("汉字");
tstring strCHNN;
tstringstream strm;
strm << strCHN;
strm >> strCHNN;
OutputDebugString(strCHN.c_str());
OutputDebugString(strNum.c_str());