检查自已的代码时,发现一个比较弱智的错误,是关于转码的,和CString的=操作符有关。
  为了能简单重现,我模拟了一下代码:

//未有UNICODE或_UNICODE定义
  USES_CONVERSION;
  CString sTest(_T("test中文"));
  sTest = A2W(sTest);
  ::MessageBoxW(NULL,(LPCWSTR)sTest.GetBuffer(0),L"test中文标题",MB_OK);

输出:
      对话框的内容区为乱码。

我的想象中:A2W取得宽字符串,然后赋值给CString,CString中应该保存的是宽字符串。
  显然,并不如我想,想是没用的,仔细看一下出错的原因吧。

先看看CString=操作符源码:
  #ifdef _UNICODE
  ……
  #else //!_UNICODE
  const CString& CString::operator=(LPCWSTR lpsz)
  {
     int nSrcLen = lpsz != NULL ? wcslen(lpsz) : 0;
     AllocBeforeWrite(nSrcLen*2);
     _wcstombsz(m_pchData, lpsz, (nSrcLen*2)+1);
     ReleaseBuffer();
     return *this;
  }
  哇,_wcstombsz在干什么?
  再看看它的代码:
  int AFX_CDECL _wcstombsz(char* mbstr, const wchar_t* wcstr, size_t count)
  {
     if (count == 0 && mbstr != NULL)
        return 0;
     int result = ::WideCharToMultiByte(CP_ACP, 0, wcstr, -1,
         mbstr, count, NULL, NULL);
     ASSERT(mbstr == NULL || result <= (int)count);
     if (result > 0)
         mbstr[result-1] = 0;
     return result;
  }
  嘿,居然是在转码噢。
  好了,答案找到了,CString的 = 操作符居然会智能的做转码,所以上面代码的sTest最终得到的仍然是ANSI字符串。因此,输出是乱码。

结论:CString = 操作符是有转码功能的,会将右侧的字符转为TCHAR的当前编码方式。
  换句话说,如果你想实现A2T或是W2T,那你根本不需要用ATL的宏,直接用CString的=就可以了,呵呵。

好了,改一下前文的代码,不能想当然,老老实实的做吧。
  USES_CONVERSION;
  CString sTest(_T("test中文"));
  LPWSTR lpwszTest = A2W(sTest);
  ::MessageBoxW(NULL,lpwszTest.GetBuffer(0),L"test中文标题",MB_OK);

转载于:https://www.cnblogs.com/lzjsky/archive/2011/01/30/1947809.html

关于CString的=操作符相关推荐

  1. MFC计算器 ---- 进阶版

    执行之后的效果图 源码https://download.csdn.net/download/sinat_38626955/12647267 模仿Win10自带的计算器,搞一个好看点的计算器 虽然功能和 ...

  2. BSTR 、LPCTSTR、CString附C语言串基本操作

    CString ,BSTR ,LPCTSTR之间关系和区别 CString是一个动态TCHAR数组,BSTR是一种专有格式的字符串(需要用系统提供的函数来操纵,LPCTSTR只是一个常量的TCHAR指 ...

  3. C++高精度运算类bign (重载操作符)

    大数据操作,有例如以下问题: 计算:456789135612326542132123+14875231656511323132 456789135612326542132123*14875231656 ...

  4. 我平常整理了CString的一些用法,很实用,发给你共享,相信你以后遇到CString的问题都会迎刃而解:...

    2019独角兽企业重金招聘Python工程师标准>>> CString 是一种很有用的数据类型.它们很大程度上简化了MFC中的许多操作,使得MFC在做字符串操作的时候方便了很多.不管 ...

  5. 结构体 CString QString 成员赋值出错

    结构体 CString QString 成员赋值出错 参考:http://blog.csdn.net/lzyzuixin/article/details/6230981 问题如下: 我定义了如下的一个 ...

  6. CString类的转换

    通过阅读本文你可以学习如何有效地使用 CString. CString 是一种很有用的数据类型.它们很大程度上简化了MFC中的许多操作,使得MFC在做字符串操作的时候方便了很多.不管怎样,使用CStr ...

  7. CString, BSTR, LPCTSTR之间得关系和区别

    CString是一个动态TCHAR数组,BSTR是一种专有格式的字符串(需要用系统提供的函数来操纵,LPCTSTR只是一个常量的TCHAR指针. CString 是一个完全独立的类,动态的TCHAR数 ...

  8. CString, BSTR, LPCTSTR 概念(转)

    CString是一个动态TCHAR数组,BSTR是一种专有格式的字符串(需要用系统提供的函数来操纵)LPCTSTR只是一个常量的TCHAR指针. CString 是一个完全独立的类,动态的TCHAR数 ...

  9. cstring转为long64_CString 与其他数据类型的转换(转)

    1 CString,int,string,char*之间的转换 string 转 CString CString.format("%s", string.c_str()); cha ...

最新文章

  1. Winform中设置ZedGraph鼠标悬浮显示线上的点的坐标并自定义显示的内容
  2. 红帽linux5安装Oracle 9i enterprise
  3. apt ubuntu 指定ipv4_macOS 下使用 Docker 搭建 ubuntu 环境
  4. php slug,PHP函数使slug(URL字符串)
  5. Clojure 学习入门(15)- 条件判断
  6. android自定义手势解锁View
  7. pytorch关系抽取框架OpenNRE源码解读与实践:PCNN ATT
  8. linux 多核 双系统,Linux GRUB实现双系统引导教程
  9. 计算机专科大学三年规划书,专科大学规划书范文
  10. 苹果手机从企业微信进入小程序下载不了图片
  11. 华为云内网DNS地址大全(不同区域DNS地址)
  12. 循环神经网络的从零开始实现
  13. 学生端伽卡他彻底卸载
  14. 用递归法求两个数的最大公约数
  15. 为什么Qt编程出现No signal?
  16. GitLab设置受保护的分支
  17. Transformer28
  18. HTML5新特性(基本)
  19. mysql日志文件名字_MySQL各类日志文件相关变量介绍
  20. 《给研究生的学术建议》14——答辩

热门文章

  1. php android 复制粘贴板,Android_Android剪贴板用法详解,本文实例详述了Android剪贴板的 - phpStudy...
  2. linux缓存文件用户权限错误,Laravel运行缓存权限问题
  3. mysql单表简单排序查询
  4. 日期时间格式之间的相互转换
  5. 命运2服务器维护时间2019,《命运2》今晚将停机维护 为多平台共用存档做准备...
  6. 腾讯校招历年经典面试汇总:C++研发岗
  7. leetcode580. 统计各专业学生人数(SQL)
  8. redis——命令请求的执行过程
  9. redis——持久化
  10. UNIX(多线程):24---哪些STL容器是线程安全的