VC++开发中最简单的Multi-Byte(ANSI)和Unicode互转方法,灵活使用Windows基本API:wsprintfA, wsprintfW

来源:互联网 发布:电信网络维护工程师 编辑:程序博客网 时间:2024/04/29 10:47

不少程序员都是从VC6.0的IDE下直接跳到VC8.0或者9.0下的。对新的IDE工程中默认的 Character Set 为 Use Unicode Character Set带来的诸多不习惯肯定深有体会。由于这个设置,我们必须要在所有的字符串前面加上宏_T()或者宏TEXT().

 

现在介绍一种简便的转换方法(无论什么 Character Set 都可以转换)

 

ANSI->Unicode

字符串

char szTemp[] = "hello world";

wchar_t szOut[0x100] = {0};

wsprintfW(szOut, L"%hs", szTemp);

单个字符

wsprintf(szOut, L"%hc", 'X');

 

Unicode->ANSI

字符串

wchar_t szTemp = L"hello world";

char szOut[0x100] = {0};

wsprintfA(szOut, "%ls", szTemp);

单个字符

wsprintf(szOut, "%lc", L'X');

 

%hs可以在任何Character Set情况下输入编码为ANSI的字符串

%ls可以在任何Character Set情况下输入编码为Unicode的字符串

 

同时,wsprintf这个函数最好用的地方是你可以把它当作C下的标准格式化输入sprintf来使用,除了sprintf的基本功能外,更增加了字符转换功能,非常方便。

 

需要注意的是,在wsprintfA中,%s默认的是ANSI,在wsprintfW中%s默认对应Unicode,如果搞混的话,会输出乱码的.

 

混合使用的例子:

现在,我们的工程设置Character Set为Use Unicode Character Set,有一个传入char*类型的函数,我们需要用默认的CreateFile来打开文件(Unicode下默认调用的CreateFile实际是CreateFileW)

 

bool Open(char* szName)

{

    TCHAR szPath[0x100] = {0};

    wsprintf(szPath, _T("C://Windows//System32//%hs.exe"), szName);

    CreateFile(..., szPath, ...);

    ......

    return true;

}

 

 

原创粉丝点击