一、VS2010设置Unicode或ASCII字符集问题
VS2010中开发程序时,默认的字符集是Unicode。所以如果程序中使用字符串常量时一定要显示转换为Unicode型,否则编译时报错。如:
HDC hScrDC = CreateDC(TEXT("DISPLAY"), NULL, NULL, NULL); //为屏幕创建设备描述表
这句如果写成:
HDC hScrDC = CreateDC("DISPLAY"),NULL,NULL,NULL);
编译时提示错误如下:
error C2664: 'CreateDCW' : cannot convert parameter 1 from 'const char [8]' to 'LPCWSTR'
根据这个错误提示我们可能会将此句改为:
HDC hScrDC = CreateDC((LPCWSTR)"DISPLAY",NULL,NULL,NULL);
这句虽然能通过编译,但最终结果却不正确(hScrDC 的值为 0)!
正确的做法有二:
一、如果你希望程序支持Unicode字符集,则可以将程序改为:
HDC hScrDC = CreateDC(TEXT("DISPLAY"),NULL,NULL,NULL);
二、如果你不希望程序支持Unicode字符集,则不用改动程序。更改项目设置就可以了。
项目菜单--项目属性(最后一个)--配置属性--常规--项目默认值--字符集,(Project-> Properties-> Configurations Properties-> General-> Project Defaults-> Charater Set)将使用Unicode字符集改为未设置即可。
二、vs2010 unicode问题的解决
今天一直在思考这个问题,就是微软著名的vstudio 如何保持向下兼容,简单的说就是如何能直接把vc6的工程转化为vs2010的,后来在工程配置中发现只要把默认的mfc 的工程属性改为Use Multi-Byte Character Set 即可,这样你就可以像在vc6里边的对字符的处理方法,当然unicode字符编码方式有其好处但是每次要在界面显示字母或者字符都要进行
TCHAR wStr[255] = {0};
MultiByteToWideChar(CP_ACP,MB_COMPOSITE,data.payload,256,wStr,254)的转化,很是麻烦和浪费系统的资源,所以决定下次些相关程序的时候,把工程设置改一下。可以提高开发效率。
把strcpy函数改成wcscpy也可以编译通过。
编译错误的代码:
void playwav(TCHAR * path)
{
TCHAR szPath[100];
memset(szPath, 0, sizeof(szPath));
strcpy(szPath, path);
}
提示错误:
error C2664: “strcpy”: 不能将参数 1 从“TCHAR [100]”转换为“char *”
解决办法:
1、默认Unicode字符集: 使用wcscppy函数代替strcpy函数,或者使用_tcscpy宏。_tcscpy在头文件 tchar.h内定义。如果编译报错说没定义需要引用该头文件;_tcscpy会根据程序所设置的字符集选择相应的函数,如果支持Unicode字符集,_tcscpy宏使用wcscppy, 如果支持ASCII使用strcpy。
2、按照上面方法二设置,仍然使用strcpy函数。