_tcscpy引出的Unicode和ASCII字符集问题

 

        在VS2005内使用strcpy函数时,编译不通过。上网搜了一下,改用宏_tcscpy编译通过了,原因如下,转载了别人的答案:

 

一、VS2005设置Unicode或ASCII字符集问题

VS2005中开发程序时,默认的字符集是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字符集改为未设置即可。

二、vs2005 unicode问题的解决

今天一直在思考这个问题,就是微软著名的vstudio 如何保持向下兼容,简单的说就是如何能直接把vc6的工程转化为vs2005的,后来在工程配置中发现只要把默认的mfc 的工程属性改为Use Multi-Byte Character Set 即可,这样你就可以像在vc6里边的对字符的处理方法,当然unicode字符编码方式有其好处但是每次要在界面显示字母或者字符都要进行
TCHAR   wStr[255]   =   {0};   
    MultiByteToWideChar(CP_ACP,MB_COMPOSITE,data.payload,256,wStr,254)的转化,很是麻烦和浪费系统的资源,所以决定下次些相关程序的时候,把工程设置改一下。可以提高开发效率。

 

(以上转自:http://hi.baidu.com/ncudlz/blog/item/bcf4414ca3e26afcd62afc64.html

 

            把strcpy函数改成wcscpy也可以编译通过。

            编译错误的代码:

  1. void playwav(TCHAR * path)
  2. {
  3.     TCHAR szPath[100];
  4.     memset(szPath, 0, sizeof(szPath));
  5.     strcpy(szPath, path);
  6. }

               提示错误:

               error C2664: “strcpy”: 不能将参数 1 从“TCHAR [100]”转换为“char *”        

 

               解决办法:

               1、默认Unicode字符集: 使用wcscppy函数代替strcpy函数,或者使用_tcscpy宏。_tcscpy在头文件 tchar.h内定义。如果编译报错说没定义需要引用该头文件;_tcscpy会根据程序所设置的字符集选择相应的函数,如果支持Unicode字符集,_tcscpy宏使用wcscppy, 如果支持ASCII使用strcpy。

               2、按照上面方法二设置,仍然使用strcpy函数。

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值