关于“Error: "const char *" 类型的实参与 "LPCWSTR"类型的形参不兼容”错误的解决方案

时间:2023-01-27 20:17:55

    关于“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字符串是字符数组。字符类型有三种编码格式:

l  第一种是单字节字符集(singlebyte character set or SBCS)。

在这种编码格式下,所有字符都只用一个字节表示,ASCII码就是单字节字符。用"0"来表示一个字节的结束。

l   第二种编码格式是多字节字符集(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。

 

 

l  第三种编码格式是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编码:

单字节编码。

 

 

解决方法

方法1:

知道了原因是编码方式的不同,那么我们就来改编码方式

 

以VS2013为例

步骤1:选择菜单栏项目-属性

      

 

步骤2:配置属性-常规-字符集-Unicode ,点击应用确定后就OK了!

 

 

方法2:

MessageBox(NULL,"nihao","ahfdkj",MB_OK);修改为

MessageBoxA(NULL,"nihao","ahfdkj",MB_OK);

 

方法三:

MessageBox(NULL,"nihao","ahfdkj",MB_OK);修改为

MessageBox(NULL,L"nihao",L"ahfdkj",MB_OK);

 

方法四:

MessageBox(NULL,TEXT("nihao"),TEXT("ahfdkj"),MB_OK);

 

参考资料:

http://blog.sina.com.cn/s/blog_4b4409c30100vw9t.html