欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-06-30 10:30:12
...

代码如下:

# 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);

 

相关标签: vs