vc 中关于Unicode的一些总结

来源:互联网 发布:小米盒子 软件 编辑:程序博客网 时间:2024/05/23 10:19

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

原创粉丝点击