关于CString的=操作符
检查自已的代码时,发现一个比较弱智的错误,是关于转码的,和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的=操作符相关推荐
- MFC计算器 ---- 进阶版
执行之后的效果图 源码https://download.csdn.net/download/sinat_38626955/12647267 模仿Win10自带的计算器,搞一个好看点的计算器 虽然功能和 ...
- BSTR 、LPCTSTR、CString附C语言串基本操作
CString ,BSTR ,LPCTSTR之间关系和区别 CString是一个动态TCHAR数组,BSTR是一种专有格式的字符串(需要用系统提供的函数来操纵,LPCTSTR只是一个常量的TCHAR指 ...
- C++高精度运算类bign (重载操作符)
大数据操作,有例如以下问题: 计算:456789135612326542132123+14875231656511323132 456789135612326542132123*14875231656 ...
- 我平常整理了CString的一些用法,很实用,发给你共享,相信你以后遇到CString的问题都会迎刃而解:...
2019独角兽企业重金招聘Python工程师标准>>> CString 是一种很有用的数据类型.它们很大程度上简化了MFC中的许多操作,使得MFC在做字符串操作的时候方便了很多.不管 ...
- 结构体 CString QString 成员赋值出错
结构体 CString QString 成员赋值出错 参考:http://blog.csdn.net/lzyzuixin/article/details/6230981 问题如下: 我定义了如下的一个 ...
- CString类的转换
通过阅读本文你可以学习如何有效地使用 CString. CString 是一种很有用的数据类型.它们很大程度上简化了MFC中的许多操作,使得MFC在做字符串操作的时候方便了很多.不管怎样,使用CStr ...
- CString, BSTR, LPCTSTR之间得关系和区别
CString是一个动态TCHAR数组,BSTR是一种专有格式的字符串(需要用系统提供的函数来操纵,LPCTSTR只是一个常量的TCHAR指针. CString 是一个完全独立的类,动态的TCHAR数 ...
- CString, BSTR, LPCTSTR 概念(转)
CString是一个动态TCHAR数组,BSTR是一种专有格式的字符串(需要用系统提供的函数来操纵)LPCTSTR只是一个常量的TCHAR指针. CString 是一个完全独立的类,动态的TCHAR数 ...
- cstring转为long64_CString 与其他数据类型的转换(转)
1 CString,int,string,char*之间的转换 string 转 CString CString.format("%s", string.c_str()); cha ...
最新文章
- Winform中设置ZedGraph鼠标悬浮显示线上的点的坐标并自定义显示的内容
- 红帽linux5安装Oracle 9i enterprise
- apt ubuntu 指定ipv4_macOS 下使用 Docker 搭建 ubuntu 环境
- php slug,PHP函数使slug(URL字符串)
- Clojure 学习入门(15)- 条件判断
- android自定义手势解锁View
- pytorch关系抽取框架OpenNRE源码解读与实践:PCNN ATT
- linux 多核 双系统,Linux GRUB实现双系统引导教程
- 计算机专科大学三年规划书,专科大学规划书范文
- 苹果手机从企业微信进入小程序下载不了图片
- 华为云内网DNS地址大全(不同区域DNS地址)
- 循环神经网络的从零开始实现
- 学生端伽卡他彻底卸载
- 用递归法求两个数的最大公约数
- 为什么Qt编程出现No signal?
- GitLab设置受保护的分支
- Transformer28
- HTML5新特性(基本)
- mysql日志文件名字_MySQL各类日志文件相关变量介绍
- 《给研究生的学术建议》14——答辩
热门文章
- php android 复制粘贴板,Android_Android剪贴板用法详解,本文实例详述了Android剪贴板的 - phpStudy...
- linux缓存文件用户权限错误,Laravel运行缓存权限问题
- mysql单表简单排序查询
- 日期时间格式之间的相互转换
- 命运2服务器维护时间2019,《命运2》今晚将停机维护 为多平台共用存档做准备...
- 腾讯校招历年经典面试汇总:C++研发岗
- leetcode580. 统计各专业学生人数(SQL)
- redis——命令请求的执行过程
- redis——持久化
- UNIX(多线程):24---哪些STL容器是线程安全的