关于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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/462775.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

分布式锁的几种使用方式(redis、zookeeper、数据库)

三种方案的比较 从理解的难易程度角度&#xff08;从低到高&#xff09; 数据库 > 缓存 > Zookeeper从实现的复杂性角度&#xff08;从低到高&#xff09; Zookeeper > 缓存 > 数据库从性能角度&#xff08;从高到低&#xff09; 缓存 > Zookeeper > 数据库从…

SQL优化准则

1. 在长时间运行的查询和短查询中使用事务 如果预期有一个长时间运行的查询&#xff0c;并且有大量的数据输出时&#xff0c;开发者就应该在BEGIN TRAN 和END TRAN之间使用事务。 这样事务会在缓冲区缓存为独立事务&#xff0c;并会被分配特定内存&#xff0c;以此来提高处理…

C语言库函数--strstr()

原型&#xff1a;extern char *strstr(const char *str1, const char *str2); 需要包含的头文件&#xff1a;#include <string.h> 作用&#xff1a;用于判断字符串str2在字符串str1中第一次出现的位置。如果没有找到则返回NULL&#xff0c;找到了则返回str1中的位置。 …

《离散数学》双语专业词汇表 名词术语中英文索引

《离散数学》双语专业词汇表 set&#xff1a;集合 subset&#xff1a;子集 element, member&#xff1a;成员&#xff0c;元素 well-defined&#xff1a; 良定&#xff0c;完全确定 brace&#xff1a;花括号 representation&#xff1a;表示 sensible&#xff1a; 有意义的 rat…

less is more,so 只记 less

less 文件名 1.Enter键  &#xff1a;向下翻一行 2.空格键   &#xff1a;向下翻一屏 3.j键    &#xff1a;想下翻一行 4.k键    &#xff1a;向上翻一行 5.f键    &#xff1a;向下翻一屏 6.b键     &#xff1a; 向上翻一屏 7.d键    &#xff1a;向…

预祝大家2011农历新年快乐,宏“兔”大展,心想事成~

预祝大家2011农历新年快乐&#xff0c;宏“兔”大展&#xff0c;心想事成&#xff5e; 又是一年新年到&#xff0c;预祝大家2011农历新年快乐&#xff0c;宏“兔”大展&#xff0c;心想事成&#xff5e; _____________________________________________________ 以下是附带的……

MySQL中的表压缩功能

MySQL版本&#xff1a;8.0.22 os&#xff1a;linux ubuntu 语言&#xff1a;c、c 在MySQL中支持3种类型的表压缩&#xff0c;依次为&#xff1a;传统压缩、TPC压缩、字典压缩。 第一种&#xff1a;传统压缩 传统的表压缩方式是在MySQL5.0.7之前使用的&#xff0c;现在已经废…

net core体系-web应用程序-4asp.net core2.0 项目实战(1)-11项目日志解决方案

本文目录1. Net下日志记录2. NLog的使用 2.1 添加nuget引用NLog.Web.AspNetCore 2.2 配置文件设置 2.3 依赖配置及调用 2.4 日志类型介绍 2.5 产生的日志文件3. 基于Microsoft.Extensions.Logging封装 3.1 添加引用Microsoft.Extensions.Logging 3.2 实现…

strcasecmp()--忽略大小写比较字符串

strcasecmp()的功能是&#xff1a;忽略大小写比较字符串 头文件 #include <strings.h> 函数原型&#xff1a;int strcasecmp(const char *s1, const char *s2); 函数功能: 用来比较参数s1和s2字符串&#xff0c;比较时会自动忽略大小写的差异。 返回值: 若参数字符串…

NDK 获取android的imei和serial number

1&#xff0c;获取imei int setAndroidDeviceID(JNIEnv *env, jobject obj,jobject mContext) {if(mContext 0){return -1;}jclass cls_context (*env)->FindClass(env, "android/content/Context");if(cls_context 0){return -1;}jmethodID getSystemService …

《JS高级程序设计》PART3.对象基础

3.2对象应用 对象废除&#xff1a;如果一个对象有2个及以上引用&#xff0c;则要正确的废除该对象&#xff0c;必须将其所有引用都设置为null。 js和java一样&#xff0c;有垃圾回收机制&#xff0c;会自动收回已无引用指向的对象。 早绑定和晚绑定 绑定&#xff1a;把对象的…

python迭代-如何对迭代器做切片操作

如何对迭代器做切片操作 问题举例 读取某个文件内容的100~300行内容&#xff0c;我们是否可以使用 类似列表切片的方式得到一个100~300行文件内容的生成器 分析 列表的切片操作其实是在重载方法__getItem__方法 可以通过file.readlines()后再做切片&#xff0c;内存会加载整个文…

如何让linux服务器同步互联网时间

今天在工作中需要搭建一个数据库集群s1&#xff0c;需要将节点A、节点B和节点C都加入集群&#xff0c;先在A节点上创建集群&#xff0c;然后将B和C节点加入到集群&#xff0c;但是在B和C加入到集群之前&#xff0c;会判断B与A、C与A的时间戳是不是在设置的2s~5s内&#xff0c;如…

Conda常见命令

Anaconda,Miniconda,Conda,Pip的区别&#xff1a; Anaconda&#xff1a;用于科学计算的python发行版&#xff0c;里面预装好了conda&#xff0c;某个版本的python&#xff0c;众多packages,科学计算工具等。Anaconda利用工具/命令conda来进行package和environment的管理&#x…

MySQL一张innodb表列个数的限制和engine的选择

在MySQL innodb存储引擎中&#xff0c;一张表中列的个数最大为4096。 其中在MySQL中&#xff0c;创建表时可以任意指定engine的类型&#xff0c;但是&#xff0c;考虑到join、union、union all等复杂的场景时&#xff0c;尽量每张表都用统一的engine。

Hibernate读书笔记

伟大的信息管理与信息系统专业&#xff0c;万恶的信息管理与信息系统专业。说这句话我是有根据的&#xff1a;因为这个专业雄心勃勃的想把自己的子弟培养成全面发展的人才但是结果则不然。两方面的原因&#xff1a;一部分在学生&#xff0c;但是一部分在这个专业。让我极其郁闷…

基于报文地址的策略路由配置示例

【实验拓扑】本文实验采用的交换机是H3C模拟器&#xff0c;下载地址如下&#xff1a; http://forum.h3c.com/forum.php? modviewthread&tid109740&highlightH3C%E6%A8%A1%E6% 8B%9F%E5%99%A8 有兴趣的朋 友可以在论坛上去下载 【组网需求】普通的报文转发是依据报文的…

html字体加大标签与写法介绍

在html中字体加大的标签为<big>&#xff0c;一般用于重要文字&#xff0c;醒目文字&#xff0c;让用户容易看到&#xff01; 字体加大: <big>写上你想写的字</big> 效果&#xff1a;未加大 加大 效果中我们能轻易分辨&#xff0c;加大和未加大的文字区别&am…

CustomValidator

使用服务器验证时 要注意 IsValid 需要再次进行判断转载于:https://www.cnblogs.com/spchenjie/archive/2011/03/02/1968968.html

MySQL单机版Recycle Bin回收站功能

最近调研了阿里的Recycle Bin回收站功能&#xff0c;可以保证数据不丢失。 为了防止开发或运维人员的误操作&#xff0c;比如DROP TABLE/DATABASE、TRUNCATE TABLE&#xff0c;这类DDL语句不具有可操作的回滚特性&#xff0c;而导致数据丢失,AliSQL 8.0(基于MySQL)新特性支持回…