MFC中char强制转换的问题...急....

同样的代码,为何在win32控制台里可以,在MFC中就不行....#pragmeonce#include<afx.h>#include<stdlib.h>#include... 同样的代码,为何在win32控制台里可以,在MFC中就不行....
#pragme once
#include <afx.h>
#include <stdlib.h>
#include <stdio.h>
#include <cstring>
#include <iostream>

CString UTF1 = (char)239;
CString UTF2 = (char)187;
CString UTF3 = (char)191;
CString head = ".......";
CString cuthead = UTF1 + UTF2 + UTF3 + head;
由于需要,要把一个UTF-8编码的文件前面的一段废话剔除掉,我是用fopen 和 fgetc把文件字符一个一个的读到CSring字符串里,然后用Replace(cuthead , "")将不想要的废话剔除....其他都好好的,但是为何一弄到MFC中就不行了(我单独把这个放在一个自定义的头文件里),小弟初学...求大神详细指点....
展开
 我来答
wwylele
2014-07-23 · TA获得超过2523个赞
知道小有建树答主
回答量:1037
采纳率:0%
帮助的人:1089万
展开全部
首先,C++中存在两种字符(串)类型,叫做窄字符(串)类型(char)与宽字符(串)类型(wchar_t),前者1个字节(对应ANSII以及各地区的多字节字符编码),后者2个字节(对应UTF-16编码)。在库中,几乎所有库函数、库类(C++基本库、windowsAPI等等)中所有字符串相关的函数或类几乎都有分别处理两种字符串的两个版本。C++的工程设置里有一项“字符集”可以选择,而有很多库函数或库类就会根据这个选项的选择来变换自己对应处理的字符串。例如这段代码中用到的CString,其实它是这样定义的:

#ifdef _UNICODE//这个宏的存在与否由上述选项决定
typedef CStringT<wchar_t,StrTraitMFC< wchar_t > > CString;
#else
typedef CStringT<char,StrTraitMFC< char >> CString;
#endif
可以看到CString是模板类CStringT的一个typedef,而模板类使用的字符类型则是随着工程设置变化而变化的。

另一个更烦人的事情是,控制台程序初始默认使用char,而MFC程序初始默认使用wchar_t,这也就导致了这段代码在不同环境下有不同的编译结果

解决方法一:
CString更改为CStringA强制使用char进行处理
(注,typedef CStringT< char, StrTraitMFC< char > > CStringA;在afx.h里有定义)

解决方法二:
更改工程设置。菜单栏“项目”最后一行”属性“,里面找”配置属性“”常规“,右侧找“字符集”,选择“多字节字符集”(对应的就是char)

解决方法三:
开头包含TCHAR.h文件
代码中所有char改为TCHAR
TCHAR这个类型也是会随着工程设置的改变而匹配char或wchar_t的
更多追问追答
追问
我设置了就是用的多字节的....
追答
那就奇怪了……确定MFC工程设置成了多字节?
来自月岩仪态万千的比目鱼
2014-07-23 · TA获得超过1571个赞
知道小有建树答主
回答量:1221
采纳率:50%
帮助的人:967万
展开全部
CString UTF1 = (char)239;

这是什么意思?

你是想把239转成字符串“239”吗?
这样的话,直接使用
int i = 239;
UTT1.Format("%s",i);
就可以了。
更多追问追答
追问
额...239是一个字符的编码....239 187 191是UTF-8文件的头三个字符
追答
编码什么的在这里没有关系,你的疑问不是类型的转换出问题吗?
我上面的意思是问,你读出的239是以什么类型保存的,然后想转换为CString。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式