zoukankan      html  css  js  c++  java
  • Ansi 与 Unicode 字符串类型的互相转换

    WideCharToMultiByte 实现宽字节转换到窄字节
    MultiByteToWideChar 实现窄字节转换到宽字节

    WideCharToMultiByte 的代码页用来标记与新转换的字符串相关的代码页;
    MultiByteToWideChar 的代码页用来标记与一个多字节字符串相关的代码页,

    [1]、常用的代码页有 CP_ACP 和 CP_UTF8 两个:

    使用 CP_ACP 代码页就实现了 ANSI 与 Unicode 之间的转换;--- 我们所用的!
    使用 CP_UTF8 代码页就实现了 UTF-8 与 Unicode 之间的转换。

    [2]、dwFlags 参数允许我们进行额外的控制,但是,一般情况下都不使用这个标志,直接传递 0 就行了。

    [3]、lpDefaultChar和pfUsedDefaultChar:只有当WideCharToMultiByte函数遇到一个宽字节字符,而该字符在uCodePage参数标识的代码页中并没有它的表示法时,WideCharToMultiByte函数才使用这两个参数。如果宽字节字符不能被转换,该函数便使用lpDefaultChar参数指向的字符。如果该参数是NULL(这是大多数情况下的参数值),那么该函数使用系统的默认字符。该默认字符通常是个问号。这对于文件名来说是危险的,因为问号是个通配符。pfUsedDefaultChar参数指向一个布尔变量,如果Unicode字符串中至少有一个字符不能转换成等价多字节字符,那么函数就将该变量置为TRUE。如果所有字符均被成功地转换,那么该函数就将该变量置为FALSE。当函数返回以便检查宽字节字符串是否被成功地转换后,可以测试该变量。

    ● 两个转换函数的使用举例:

    char *cctryWideCharToAnsi(wchar_t *pWideChar)
    {
    if (!pWideChar) return NULL;
    char *pszBuf = NULL;
    int needBytes = WideCharToMultiByte(CP_ACP, 0, pWideChar, -1, NULL, 0, NULL, NULL);
    if (needBytes > 0){
    pszBuf = new char[needBytes+1];
    ZeroMemory(pszBuf, (needBytes+1)*sizeof(char));
    WideCharToMultiByte(CP_ACP, 0, pWideChar, -1, pszBuf, needBytes, NULL, NULL);
    }

    return pszBuf;
    }

    wchar_t* p = L"这个是宽字节转窄字节";

    char* buf = cctryWideCharToAnsi(p);

    wchar_t *cctryAnsiCharToWide(char *pChar)
    {
    if (!pChar) return NULL;
    wchar_t *pszBuf = NULL;
    int needWChar = MultiByteToWideChar(CP_ACP, 0, pChar, -1, NULL, 0);
    if (needWChar > 0){
    pszBuf = new wchar_t[needWChar+1];
    ZeroMemory(pszBuf, (needWChar+1)*sizeof(wchar_t));
    MultiByteToWideChar(CP_ACP, 0, pChar, -1, pszBuf, needWChar);
    }

    return pszBuf;
    }

    char* p = "窄字节转宽字节";

    wchar_t* result;

    result = cctryAnsiCharToWide(p);

    最后记得delete[] ..

    〓※※※〓 使用过后千万别忘记释放空间…… delete[]...

    也可以使用 

    ● A2W、W2A、T2A、T2W 宏的使用以及注意事项

    A2W,就是ANSI转unicode

    W2A,就是UNICODE转ANSI

    USES_CONVERSION; //记得加上这句
    wchar_t* pw = L"你好,这个是宽字节转窄字节 ";
    char* p = W2A(pw);

  • 相关阅读:
    121. Best Time to Buy and Sell Stock
    70. Climbing Stairs
    647. Palindromic Substrings
    609. Find Duplicate File in System
    583. Delete Operation for Two Strings
    556 Next Greater Element III
    553. Optimal Division
    539. Minimum Time Difference
    537. Complex Number Multiplication
    227. Basic Calculator II
  • 原文地址:https://www.cnblogs.com/killbit/p/4210262.html
Copyright © 2011-2022 走看看