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

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;

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏小灰灰

JDK容器学习之ArrayList:底层存储和动态扩容

ArrayList 底层存储和动态扩容逻辑 ArrayList 作为最常用的容器之一,通常用来存储一系列的数据对象,O(1)级别的数据读写 I. 底层数据模型...

1667
来自专栏jeremy的技术点滴

py3_cookbook_notes_01

2938
来自专栏java小白

ArrayList源码详解

1525
来自专栏听雨堂

代码页

  最近写一个网络程序时,碰到字符串和字节数组之间的转换问题,开始时还比较简单,字符串都是标准的Ascll编码,处理起来比较简单:   字符串转字节数组 by...

1819
来自专栏赵俊的Java专栏

从源码上分析 ArrayList

1081
来自专栏PhpZendo

PHP 数组使用之道

这个教程我将通过一些实用的实例和最佳实践的方式列举出 PHP 中常用的数组函数。每个 PHP 工程师都应该掌握它们的使用方法,以及如何通过组合使用来编写更精简且...

512
来自专栏深度学习之tensorflow实战篇

python pandas.read_csv参数整理,读取txt,csv文件

pandas.read_csv参数整理 读取CSV(逗号分割)文件到DataFrame 也支持文件的部分导入和选择迭代 更多帮助参见:http://pandas...

8656
来自专栏塔奇克马敲代码

第4章 表达式

1654
来自专栏开发之途

Java集合框架源码解析之ArrayList

1313
来自专栏阿凯的Excel

Read_CSV参数详解

pandas.read_csv参数详解 pandas.read_csv参数整理 读取CSV(逗号分割)文件到DataFrame 也支持文件的部分导入和选择迭代 ...

3076

扫码关注云+社区