C++的字符集设置

VS2010 MFC字符集问题解决
本文介绍了在使用VS2010与MFC开发时遇到的(LPWSTR)报错问题及其解决方案。通过调整项目设置中的字符集选项,从Unicode改为多字节字符集即可解决。此外,文章还详细解释了ANSI与Unicode字符集的区别,并讨论了相关字符串指针类型如LPSTR、LPCSTR、LPTSTR和LPCTSTR的含义与应用场景。

转自:http://blog.youkuaiyun.com/heathyhuhu/article/details/17594379

 

今天在使用vs2010+MFC时候,使用(LPWSTR)发生报错。

其解决方案就是, 在项目属性->常规->项目默认值->字符集里面,将使用Unicode字符集换为:使用多字节字符集就ok了。 原因:

typedef LPCTSTR LPTSTR ;
#ifndef _UNICODE typedef TCHAR char;
#else typedef TCHAR wchar_t;
#endif typedef LPTSTR const TCHAR*;
看到一篇很好的讲字符集(charset)转载过来。。感谢freebot楼主。
LPSTR、LPCSTR、LPTSTR和LPCTSTR的意义及区别

 

1、ANSI(即MBCS):为多字节字符集,它是不定长表示世界文字的编码方式。ANSI表示英文字母时就和

ASCII一样,但表示其他文字时就需要用多字节。

2、Unicode:用两个字节表示一个字符的编码方式。比如字符'A'在ASCII下面用一个字节表示,而在

Unicode下面用两个字节表示,其中高字节用“0”填充;函数'程'在ASCII下面用两个字节表示,而在

Unicode下面也是用两个字节表示。Unicode的用处就是定长表示世界文字,据统计,用两个字节可以编码

现存的所有文字而没有二义。

3、Windows下的程序设计可以支持ANSI和Unicode两种编码方法的字符串,具体使用哪种就要看定义了

MBCS宏还是Unicode宏。MBCS宏对应的字符串指针为LPSTR(即char*),Unicode对应的指针为

LPWSTR(即unsigned char*)。为了写程序的方便,微软定义了类型LPTSTR,在MBCS下它表示char*,

在Unicode下它表示unsigned char*,这就可以重定义一个宏进行不同字符集的转换了。

4、关系

LPSTR:指向一个字符串的32位指针,每个字符占1个字节。

LPCSTR:指向一个常量字符串的32位指针,每个字符占1个字节。

LPTSTR:指向一个字符串的32位指针,每个字符可能占1个字节或2个字节。

LPCTSTR:指向一个常量字符串的32位指针,每个字符可能占1个字节或2个字节。

5、Windows使用两种字符集ANSI和Unicode,前者在处理英文字符时使用单字节方式,在处理中文字符时

使用双字节方式。后者不管是英文字符还是中文字符都是采用双字节方式表示。Windows NT的所有与字符

有关的函数都提供了两种方式的版本,而Windows 9x只支持ANSI方式。_T一般同字符常量相关,如_T("你

好!");。如果编码方式为ANSI,_T不起任何作用;如果编码方式为Unicode,编译器会把"你好!"以

Unicode方式进行保存。_T和_L的区别在于,_L不管你是以什么方式编译,一律以Unicode方法保存。

6、L表示字符串资源采用Unicode编码方式,示例如下:

wchar_t Str[]=L"Hello World!"; //每个字符都用2个字节来存储

7、_T是一个适配宏。当定义了_UNICODE时,_T和L相同;否则,_T的字符串采用ANSI编码方式。示例如

下:

LPTSTR lptStr=new TCHAR[32];

TCHAR* szBuf=_T("Hello");

以上两个语句,无论是在ANSI编码方式,还是在Unicode编码方式下都是正确的。

8、微软推荐使用相匹配的字符串函数。例如,在处理LPTSTR或LPCTSTR的时候,应该使用_tcslen来替

代strlen函数。否则,在Unicode编码方式下,strlen不能处理wchar_t*的字符串。

9、T是一个非常重要的符号(TCHAR、LPTSTR、LPCTSTR、_T()和_TEXT()等),它表示使用一个中间

类型,既不明确表示使用MBCS,也不明确表示使用Unicode。到底使用哪种字符集,在编译的时候才决

定。

10、CString类型到LPTSTR类型的转换

CString path1;

LPTSTR path2=path1.GetBuffer(path1.GetLenght());

转载于:https://www.cnblogs.com/sunky/articles/5344238.html

### C++字符集与编码的相关概念 #### 可执行字符集的概念 在 C/C++ 的开发过程中,可执行字符集指的是程序被编译成二进制文件后,用于表示字符的内部编码方式。这种编码决定了如何解释和存储字符串以及字符常量的内容[^1]。 #### 源代码到执行过程中的三个主要字符集 C++ 程序从编写到运行涉及多个阶段,在这些阶段中会用到三种不同的字符集: 1. **源代码字符集**:这是程序员输入并保存在源文件中的字符集合。 2. **可执行文件字符集**:指代的是目标机器上实际使用的字符编码形式,它由编译器决定并将源代码中的字符映射至此编码体系下[^2]。 3. **界面字符集**:特别是在控制台应用中表现出来的外部交互所依赖的字符集,这通常取决于操作系统的设置或者终端配置。 #### 字符编码转换的需求及其解决办法 因为不同平台和支持的服务可能采用不一样的默认编码方案(如 ASCII, UTF-8, GBK),所以在跨平台移植软件时经常遇到兼容性问题。因此,对于多语言支持的应用来说,实现有效的字符编码转换是非常重要的。可以利用一些成熟的第三方库来简化这一流程,例如 ICU (International Components for Unicode) 或 Boost.Locale 提供的功能可以帮助开发者轻松完成各种主流编码间的互转工作[^3]。 以下是基于标准库的一个简单例子展示如何手动处理基本类型的单字节向宽字符转变: ```cpp #include <iostream> #include <locale> #include <codecvt> int main() { std::wstring_convert<std::codecvt_utf8<wchar_t>, wchar_t> converter; // Convert from UTF-8 string to wstring const char* utf8_str = u8"你好"; std::wstring wide_str = converter.from_bytes(utf8_str); // Output the result as a wide character stream std::wcout << L"Wide String: " << wide_str << std::endl; return 0; } ``` 此段代码展示了通过 `std::wstring_convert` 和 `std::codecvt_utf8` 类型来进行简单的 UTF-8 到 Wide Character (`wchar_t`) 转换的方法。注意这种方法已被标记为废弃(deprecated), 推荐使用更新的技术栈替代旧有机制。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值