zoukankan      html  css  js  c++  java
  • 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函数在输出时,只会输出第一个字符。

  • 相关阅读:
    Petapoco 数据库操作类
    .net Cookie操作公共方法 CookieHelper
    .net 服务端缓存 Cache/CacheHelper
    Base64加密解密方法
    对多字段进行去重 ( Linq 方式 )
    BootStrap之 提示工具(Tooltip)插件
    bootstrap之弹出框
    Jquery 强大的表单验证操作
    强大的数据库工具 dbForge Studio ForMySql
    My操作小技巧
  • 原文地址:https://www.cnblogs.com/cnstalker/p/4828970.html
Copyright © 2011-2022 走看看