• ANIS与UNICODE字符格式转换:MultiByteToWideChar() 和WideCharToMultiByte() 函数


    资料来自: 

    http://blog.csdn.net/holamirai/article/details/47948745

    http://www.cnblogs.com/wanghao111/archive/2009/05/25/1489021.html

    ----------------------------------------------------------------------------------------------------------------

    使用MultiByteToWideChar() 和 WideCharToMultiByte() 函数进行ANSI和UNICODE转换时,微软推荐通过执行同一函数两次,以确保转换成功,第一次执行获取保存转换结果所需内存大小,根据其返回值申请一片内存,第二次才真正执行转换。

    MultiByteToWideChar() 返回值是确保转换成功的宽字符数,因此申请空间时需要乘以sizeof(wchar_t)。

    WideCharToMultiByte() 返回值直接是确保转换成功所需的字节数,无需执行乘以sizeof操作;

    具体实现可见示例代码。

    宽字符到多字节字符转换函数

    int WideCharToMultiByte( 
    UINT CodePage, 
    DWORD dwFlags, 
    LPCWSTR lpWideCharStr, 
    int cchWideChar, 
    LPSTR lpMultiByteStr, 
    int cbMultiByte, 
    LPCSTR lpDefaultChar, 
    LPBOOL lpUsedDefaultChar 
    );
    CodePage: 指定要转换成的字符集代码页,它可以是任何已经安装的或系统自带的字符集,你也可以使用如下所示代码页之一。 
    CP_ACP 当前系统ANSI代码页 
    CP_MACCP 当前系统Macintosh代码页 
    CP_OEMCP 当前系统OEM代码页,一种原始设备制造商硬件扫描码 
    CP_SYMBOL Symbol代码页,用于Windows 2000及以后版本,我不明白是什么 
    CP_THREAD_ACP 当前线程ANSI代码页,用于Windows 2000及以后版本,我不明白是什么 
    CP_UTF7 UTF-7,设置此值时lpDefaultChar和lpUsedDefaultChar都必须为NULL 
    CP_UTF8 UTF-8,设置此值时lpDefaultChar和lpUsedDefaultChar都必须为NULL 

    注意:函数WideCharToMultiByte使用不当,会给影响程序的安全。调用此函数会很容易导致内存泄漏,因为lpWideCharStr指向的输入缓冲区大小是宽字符数,而lpMultiByteStr指向的输出缓冲区大小是字节数。为了避免内存泄漏,应确保为输出缓冲区指定合适的大小。我的方法是先使cbMultiByte为0调用WideCharToMultiByte一次以获得所需缓冲区大小,为缓冲区分配空间,然后再次调用WideCharToMultiByte填充缓冲区,详见下面的代码。另外,从Unicode UTF16向非Unicode字符集转换可能会导致数据丢失,因为该字符集可能无法找到表示特定Unicode数据的字符。

    多字节字符到宽字符转换函数

    int MultiByteToWideChar( 
    UINT CodePage, 
    DWORD dwFlags, 
    LPCSTR lpMultiByteStr, 
    int cbMultiByte, 
    LPWSTR lpWideCharStr, 
    int cchWideChar 
    ); 
    dwFlags: 指定是否转换成预制字符或合成的宽字符,对控制字符是否使用像形文字,以及怎样处理无效字符。 
    MB_PRECOMPOSED 总是使用预制字符,即有单个预制字符时,就不会使用分解的基字符和不占空间字符。此为函数的默认选项,不能和MB_COMPOSITE合用 
    MB_COMPOSITE 总是使用分解字符,即总是使用基字符+不占空间字符的方式 
    MB_ERR_INVALID_CHARS 设置此选项,函数遇到非法字符就失败并返回错误码ERROR_NO_UNICODE_TRANSLATION,否则丢弃非法字符 
    MB_USEGLYPHCHARS 使用像形字符代替控制字符 

    示例代码

    #include "iostream"
    #include "windows.h"
    using namespace std;
    
    void main()
    {
        // UINCONDE  to  ANSI
        wchar_t* pwszUnicode = L"Holle, word! 你好,中国! "; 
        int iSize; 
        char* pszMultiByte; 
        iSize = WideCharToMultiByte(CP_ACP, 0, pwszUnicode, -1, NULL, 0, NULL, NULL); 
        pszMultiByte = (char*)malloc((iSize)/**sizeof(char)*/); 
        WideCharToMultiByte(CP_ACP, 0, pwszUnicode, -1, pszMultiByte, iSize, NULL, NULL);
        cout<<"UINCONDE to ANSI:"<<pszMultiByte<<endl;
    
    
        // ANSI to UNICODE
        locale loc( "chs" ); // 定义“区域设置”为中文方式
        wcout.imbue( loc ); // 载入中文字符输入方式
        char *pByteStr = "hello world! 你好,中国! "; 
        int iSize1;
        wchar_t *pWideStr ;
        iSize1 = MultiByteToWideChar(CP_ACP,0,pByteStr,-1,NULL,0);
        pWideStr = (wchar_t*)malloc(iSize1*sizeof(wchar_t));
        MultiByteToWideChar(CP_ACP,0,pByteStr,-1,pWideStr,iSize1*sizeof(wchar_t));
        wcout<<"ANSI to UNICODE:"<<pWideStr<<endl;
        system("pause");
    
    }
  • 相关阅读:
    02:AWT介绍
    01:GUI编程简介
    业余草 SpringCloud教程 | 第六篇: 分布式配置中心(Spring Cloud Config)(Finchley版本)
    业余草 SpringCloud教程 | 第五篇: 路由网关(zuul)(Finchley版本)
    业余草 SpringCloud教程 | 第四篇:断路器(Hystrix)(Finchley版本)
    业余草 SpringCloud教程 | 第三篇: 服务消费者(Feign)(Finchley版本)
    业余草 SpringCloud教程 | 第二篇: 服务消费者(rest+ribbon)(Finchley版本)
    业余草 SpringCloud 教程 | 第一篇: 服务的注册与发现Eureka(Finchley版本)
    业余草分享2018最新面试题总结
    业余草分享面试题,JVM结构、GC工作机制详解
  • 原文地址:https://www.cnblogs.com/personnel/p/8280173.html
Copyright © 2020-2023  润新知