关于“Error: “const char *“ 类型的实参与 “LPCWSTR“类型的形参不兼容”错误的解决方案
代码如下:
# include <windows.h>
int main()
{
MessageBox(NULL,"nihao","ahfdkj",MB_OK);
return 0;
}
1.原因分析
这是由于字符编码问题引起的。
VC6 默认使用的 MBCS(多字节字符集) 编码,而 VS2010 及高版本 VS默认使用的 Unicode编码。
2. 三种编码格式(准备知识)
所有的string类都是以C-style字符串为基础的。C-style字符串是字符数组。字符类型有三种编码格式:
第一种是单字节字符集(singlebyte character set or SBCS)。
在这种编码格式下,所有字符都只用一个字节表示,ASCII码就是单字节字符。用"0"来表示一个字节的结束。
第二种编码格式是多字节字符集(multi-bytecharacter set or MBCS)。
即:支持多字节的字符集。
多字节字符集 (MBCS) 是一种旧的方式以支持无法用单字节表示的字符集(如日文和中文)的方法。 如果执行新开发,对于所有的文本字符串应该使用Unicode,除非最终用户没有看到系统字符串。 MBCS 是传统技术,不建议用于新开发中。
最常见的 MBCS 实现是双字节字符集(DBCS)。在Windows里的MBCS包含两种字符类型:单字节字符(singlebyte characters )和双字节字符(doublebyte characters)。
由于Windows 里使用的多字节字符绝大部分是两个字节长,MBCS常被DBCS(double-byte character set)代替。
一般来说,VisualC++(尤其是 MFC)完全支持 DBCS。
第三种编码格式是Unicode。
最初的unicode编码是固定长度的,16位,也就是2两个字节代表一个字符,这样一共可以表示65536个字符。显然,这样要表示各种语言中所有的字符是远远不够的。Unicode4.0规范考虑到了这种情况,定义了一组附加字符编码,附加字符编码采用2个16位来表示,这样最多可以定义1048576个附加字符,目前unicode4.0只定义了45960个附加字符。
Unicode只是一个编码规范,目前实际实现的unicode编码只有三种:UTF-8,UCS-2和UTF-16,三种unicode字符集之间可以按照规范进行转换。
3. MBCS编码,Unicode编码与ACIll编码对比
Unicode编码 |
有三种编码方式 |
MBCS编码 |
多字节编码。 |
ACILL编码 |
单字节编码。 |
4. 解决方法
方法1:
知道了原因是编码方式的不同,那么我们就来改编码方式
以VS2013为例
步骤1:选择菜单栏项目-属性
步骤2:配置属性-常规-字符集-Unicode ,点击应用确定后就OK了!
方法2:
MessageBox(NULL,"nihao","ahfdkj",MB_OK);
修改为
MessageBoxA(NULL,"nihao","ahfdkj",MB_OK);
方法3:
MessageBox(NULL,"nihao","ahfdkj",MB_OK);
修改为
MessageBox(NULL,L"nihao",L"ahfdkj",MB_OK);
方法4:
MessageBox(NULL, TEXT("nihao"), TEXT("ahfdkj"), MB_OK);