vc 中关于Unicode的一些总结

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值