您的位置:首页 > 其它

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

2016-05-15 20:47 801 查看

关于“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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: