Fork me on GitHub

Visual Studio的Unicode和ASCII

Visual C++自2005版之后,工程的默认字符集属性改为使用宽字符集(Unicode),因此默认情况下不应使用多字节字符集(ASCII)。

这个改动让我们从网上、书上等处获取的代码无法正常编译。例如下面这个基于控制台、获取文件绝对路径的程序。

#include<windows.h>
#include<stdio.h>
int main()
{
   char szDir[MAX_PATH];
 
   GetCurrentDirectory(MAX_PATH,szDir);
   printf("The Current Directory is %s",szDir);
 
   getchar();
   return 0;
}

在2005以后的Visual C++版本中,由于默认使用了Unicode,该程序无法正常编译。

解决办法有很多:

方法一:(推荐)

使用Unicode的类型、函数。本例中将类型char变为TCHAR,函数printf改为wprintf,字符串的前面加L,或用放在_T( )的括号中。如下:

#include<windows.h>
#include<stdio.h>
int main()
{
   TCHAR szDir[MAX_PATH];
 
   GetCurrentDirectory(MAX_PATH,szDir);
   wprintf(L"The Current Directory is %s",szDir);
 
   getchar();
   return 0;
}

方法二:(推荐)

不修改源代码,而去修改编译器的设置。

右键“项目”—“属性”—“常规”—“字符集”(由默认的Unicode字符集改为“未设置”或“多字节字符集”)

方法三:(不推荐)

把函数改为ASCII的函数。如将GetCurrentDirectory改为GetCurrentDirectoryA。

 

另外,编译无法通过时通常提示类型转换方面的错误信息。比如,提示不能将参数 2 从“char [260]”转换为“LPWSTR”。如果此时将char类型字符串强制转换成LPWSTR类型,由于Unicode中每个字符占2个字节,ASCII中每个字符占一个字节,printf函数在输出时,只会输出第一个字符。

posted on 2015-09-22 14:59  地精的贪婪  阅读(1777)  评论(0编辑  收藏  举报