CString中的字符编码问题

CString是一个封装好了的类,封装时必须考虑兼容问题,CString在多字节(ansi)环境下为CStringA,在Unicode环境下为CStringW,所以CString等价于(也就是CString封装类中实际使用的类型)LPCTSTR ,LP表示指针,C表示常量不是很重要,重要的是T这是个宏,表达的意思类似于模板参数,LPCTSTR 是一个typedef声明的一个类型,如果定义了unicode编码,宏T也表示宽字符(W表示宽字符),即一个字符占2字节。

char是ansi编码占用一个字节,只能表示256个字符,wchar_t是unicode编码,占用4字节或8字节,根据C++库决定,TCHAR的类型根据所在平台的默认编码集而定,在unicode平台则是char,在ansi(多字节编码)平台则是wchar_t,所以如果没定义unicode,使用多字节(ansi)编码 CString = LPCTSTR =const char*;如果定义了unicode, CString=LPCTSTR=LPCWSTR = const w_char*(都是宽字符);

多字节编码环境下:

CStringA strA = "汉字啊";
CString str;
str = strA;  //注意这里应调用赋值操作符重载函数,不能直接CString str = strA,因为会调用赋值构造函数而出错
CString str2 = _T("也是汉字啊");
CStringA strA2;
strA2 = str2;

Unicode编码环境下

CStringW strW = L"汉字啊";
CString str;
str = strW;
CString str2 = "也是汉字啊";
CStringW strW2;
strW2 = str2;

当不知道编码环境:

CString str = “汉字”;

const char* c_str = str;

CString str = _T("汉字啊");
const wchar_t* c_str = str; 

当工程是Unicode编码时,_T将括号内的字符串以Unicode方式保存;当工程是多字节编码时,_T将括号内的字符串以ANSI方式保存。

关键字“L”,则是不管编码环境是什么,都是将其后面的字符串以Unicode方式保存

报错:

const char*类型的实参与LPCTSTR类型的形参不兼容 MFC

MFC 使用了宽字符编码(Unicode)的字符串类型 LPCTSTR,而 "const char *" 类型是窄字符编码(ASCII)的字符串类型。

为了解决这个问题,可以进行字符串类型的转换。有几种方法可以处理这种类型不兼容的问题:

使用窄字符编码字符串: 如果你的项目中使用的是窄字符编码,就可以将 "const char *" 类型的字符串转换为窄字符编码。可以使用 CStringA 类或 std::string 类等来存储和操作窄字符编码的字符串。头文件atlstr.h

使用宽字符编码字符串: 如果你的项目中使用的是宽字符编码,就需要将 "const char *" 类型的字符串转换为宽字符编码。可以使用 CStringW 类或 std::wstring 类等来存储和操作宽字符编码的字符串。头文件atlstr.h

执行字符串编码转换: 如果你需要在窄字符编码和宽字符编码之间进行转换,可以使用字符mf串编码转换函数,例如 MultiByteToWideChar 和 WideCharToMultiByte,或者使用相应的库或函数进行字符串编码转换,如 CStringA::SetString 和 CStringW::SetString。头文件windows.h

也可以通过更改字符集解决。项目->属性->高级->高级属性->字符集,将Unicode字符集改为多字节字符集即可


为了满足程序代码的国际化需要,业界推出了Unicode标准,它提供了一种简单和一致的表达字符串的方法,所有字符串中的字节都是16位的值,其数量也可以满足差不多世界上所有书面语言字符的编码需求,开发程序时使用Unicode(类型为wchar_t)是一种被鼓励的做法。
LPWSTR与LPCWSTR由此产生,它们的含义类似于LPSTR与LPCSTR,只是字符数据时16位的wchar_t而不是char.
ANSI操作函数以str开头,如strcpy(), strcat(), strlen();
Unicode操作函数以wcs开头,如wcscpy, wcscpy(), wcslen();


 

  • 6
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

qq_54881777

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值