CString在普通ASCII编码情况下,系统默认是跟char*差不多的方式来存储(个人觉得)。

例如,声明和赋值一个CString可以这样:

char* charStr = "Kenko";

CString cstr =  charStr;

因为在ASCII编码下,CString会把后边这个指针的内存位置,作为输入流,逐个字符的读入到CString中。

但在_UNICODE宏定义下,默认都变为宽字节。那么CString存储方式将以宽字节的形式。

所以此时要CString变为wchar_t*只要如下:

CString变wchar*:
wchar_t unicodeStr[255];
wcscpy(unicodeStr, cstr);

这时要赋值给CString,就注意一定要以宽字节的形式赋值(当然直接用char*赋值给CString,系统会自动转化)。

但例如截取网页之类的,输入的字节流还是ASCII,所以会出现问题。

我在编程过程中,就以ASCII编码字节流赋值,导致在后续查找字符串的时候总是找不到。后边找到问题根源后,就把从CString得到的wchar_t*强制转化为char*。具体问题根源在代码注释中有写。

代码如下,是关于用CInternetSession,截取网页内容的。

1 //建立连接,发送请求,接收数据
2   CInternetSession httpsession;
3 CString Line;
4 CString result;
5
6 CInternetFile* webfile=NULL;
7
8 if(url==NULL) return false;
9 try
10 {
11 wchar_t unicodeStr[255];
12 wcscpy(unicodeStr, CComBSTR(url));
13 webfile=(CInternetFile*)httpsession.OpenURL(unicodeStr);
14 if(webfile)
15 {
16 int i=0;
17 while(webfile->ReadString(Line)&&i<300)
18 {
19 result=result+Line;
20 i++;
21 }
22 }
23 delete webfile;
24 httpsession.Close();
25 wchar_t unicodeStr2[3000];
26 wcscpy(unicodeStr2, result);
27 /*因为CString在读取网页时输入的是ASCII编码字节流,
28 但系统默认是接受宽字节的,所以把网页的GB2312 ASCII编码字节流每两字节读取
29 例如网页本来有1000个字符,按上边代码得到的CString GetLength只有500
30 所以这里转化为wchar_t*后,做一个强制转化就行了*/
31 char* charresult = (char*)unicodeStr2;
32 string strresult(charresult); //char* 转 string
33
34 //从html文件中得到具体信息
35   int begin=strresult.find("<body>")+6;
36 int end=strresult.find("</body>");
37 strresult=strresult.substr(begin, end-begin);
38 strcpy(resultString,strresult.c_str());
39
40 return true;

CString 在_UNICODE宏定义下和普通ASCII编码下的不同相关推荐

  1. linux宏命令编辑,linux-vim宏定义(三)

    什么是宏 计算机科学里的宏(Macro),是一种批量批处理的称谓.一般说来,宏是一种规则或模式,或称语法替换 ,用于说明某一特定输入(通常是字符串)如何根据预定义的规则转换成对应的输出(通常也是字符串 ...

  2. ANSI C and Microsoft C++中常用的预定义宏以及 宏定义中 # 和 ## 的区别

    ANSI C and Microsoft C++中常用的预定义宏以及 宏定义中 # 和 ## 的区别 第一部分,常见的预定义宏 第二部分,# 和 ## 再宏定义中的使用说明 第三部分,类似 #prag ...

  3. 6、宏定义与预处理、函数与函数库

    C语言预处理理论 由源码到可执行程序的过程 源码.c->(编译)->elf可执行程序 源码.c->(编译)->目标文件.o->(链接)->elf可执行程序 源码.c ...

  4. VC预处理指令与宏定义的妙用

    VC中预处理指令与宏定义的妙用 刚接触到MFC编程的人往往会被MFC 向导生成的各种宏定义和预处理指令所吓倒,但是预处理和宏定义又是C语言的一个强大工具.使用它们可以进行简单的源代码控制,版本控制,预 ...

  5. GetLastErr返回值ErrCode的宏定义以及含义

    参考链接:https://docs.microsoft.com/en-us/previous-versions/aa911366(v=msdn.10)?redirectedfrom=MSDN 十进制 ...

  6. 带你学C带你飞 | printf函数 | 变量 | 常量和宏定义 | 数据类型 | 取值范围 | 字符串 | 运算符

    文章目录 一.printf函数 1.printf函数 2.printf函数课后作业 二.变量 1.变量 2.变量课后作业 三.常量和宏定义 1.常量和宏定义 2.常量和宏定义的课后作业 四.数据类型 ...

  7. c语言宏定义(c语言宏定义是什么意思)

    C语言宏定义名可以有括号和分号吗? 宏定义的名称,是C语言标识符的一种,和函数名,变量名的命名规则是一样的,只允许使用数字,字母,下划线,且不能以数字开头. 所以宏名是不可以有括号和分号的. 另外,在 ...

  8. C语言【宏定义与函数的区别】

    在代码开发过程中,有一些常用或者可以通用的功能或者代码段,实现这些功能,既可以写成函数,也可以封装成为宏定义.那么究竟是用函数好,还是宏定义好?这就要求我们对二者进行合理的取舍. 先看宏 宏: #de ...

  9. C语言宏定义(常用宏定义)

    C语言常用宏定义 常用宏定义 数值相关的宏定义 字符相关的宏定义 byte相关的宏定义 bit相关的宏定义 数组与结构体相关的宏定义 对齐的宏定义 常用宏定义 数值相关的宏定义 闰年的判断 ,年份可以 ...

最新文章

  1. @FunctionalInterface
  2. JZOJ__Day 6:【普及模拟】神奇的项链(fett)
  3. Web开发的那点事--业务层常用功能
  4. Kinect开发笔记之四检测并调试Kinect设备
  5. Python习题week2
  6. 架构设计:分布式结构下,服务部署发布
  7. Codeforces Round #573 (Div. 2) C. Tokitsukaze and Discard Items
  8. centos6下的vsftpd配置
  9. mysql gtidpurged_gtid环境下mysqldump对于set-gtid-purged的取值
  10. ERA5 total precipitation的单位
  11. 系统学习机器学习之组合多分类器
  12. Android FBReader基础资料文档
  13. 学儿歌听故事android源码,儿童宝宝听儿歌故事
  14. 关闭windows server 2016弹出交互式服务检测窗口
  15. [c++简单小游戏]东搞西搞第二弹——谷歌chrome小恐龙升级版(啊哈)
  16. 2015年 行人检测总结1
  17. 2020腾讯后台开发暑期实习生面试一面分享(天美工作室群)
  18. teamviewer未就绪,请检查您的连接。
  19. Linux 安装Git Server
  20. 今天是一个特别的日子

热门文章

  1. 阿里云容器化GPU共享服务已开放!性能无损失,对你的环境无侵入,真正实现AI降本增效...
  2. iPhone用户状告App厂商手脚不干净,偷窥我电脑剪切板干什么
  3. 孙正义太难了:去年亏125亿美元,15家投资公司要破产,二期愿景基金不得不暂停...
  4. 给GAN一句描述,它就能按要求画画,微软CVPR新研究 | 附PyTorch代码
  5. vue cli3.0 引入eslint 结合vscode使用
  6. 前端小纠结--集成gitflow和standard-version使用
  7. linux下文件的压缩和解压缩
  8. 始于《将才》,而不止于将才
  9. Robots.txt - 禁止爬虫(转)
  10. 健身励志——肌肉不经锤炼不会增长