MultiByteToWideCharとWideCharToMultiByte


仕事は1年以上符号化フォーマットと何度も付き合いましたが、出会っていない問題は少し違うような気がします.windowプログラミングで言う符号化変換問題の多くはA 2 Tで解決しましたが、最近A 2 Tでは解決できない問題に遭遇しました.そして、彼らのルートMultiByteToWideCharとWideCharToMultiByeを見つけました.
これがUnicode(ワイドバイト)とANSI(マルチバイト)の文字列変換の問題です.
MultiByteToWideChar:マルチバイト文字列をワイド文字列に変換(関数Unicode符号化文字列をメモリバッファに書き込み、バッファの長さを返す)
int MultiByteToWideChar(
    UINT uCodePage,
    DWORD dwFlags,
    PCSTR pMultiByteStr,
    int cbMultiByte,
    PWSTR pWideCharStr,
    int cchWideChar
);
  • uCodePageは、マルチバイト文字列に関連する1つのコードページ値(CP_UTF 8,CP_ACP)
  • を識別する.
  • 一般的にdwFlagsの値は0
  • である.
  • pMultiByteStr変換する文字列を指定
  • cbMultiByteは文字列の長さ(バイト数)を指定し、値が-1の場合、関数はソース文字列の長さ
  • を自動的に判断する.
  • pWideCharStr Unicodeタイプ文字列のメモリアドレス
  • を指定
  • cchWideChar指定バッファの最大長
  • cchWideCharの入力値が0の場合、関数は変換されず、バッファが幅の広い文字数を収容できる場合にのみ文字変換が行われます.注意ワイドバイト文字列にメモリを割り当てる場合はバイト数である必要があります
    使用方法を見てみましょう.
    CHAR pMultiStr = {"*****"};
    TCHAR pWideStr = NULL;
    int wlenByte = 0;
    wLenByte = MultiByteToWideChar(CP_UTF8, 0, pMultiStr, -1, NULL, 0);
    // Unicode  ,  
    pWideStr = malloc(wlenByte * sizeof(TCHAR));
    wLenByte = MultiByteTOWideChar(CP_UTF8, 0, pMultiStr, -1, pWideStr, wlenByte);

    WideCharToMultiByte:ワイド文字列をマルチバイト文字列に変換()
    int WideCharToMultiByte(
        UINT uCodePage,
        DWORD dwFlags,
        PCWSTR pWideCharStr,
        int cchWideChar,
        PSTR pMultiByteStr,
        int cbMultiByte,
        PCSTR pDefaultChar,
        PBOOL pfUsedDeefaultChar
    );

    定義から分かるように、最初の6つのパラメータはMultiByteToWideCharの6つのパラメータに対応したいと考えられ、使用方法も一致し、後の2バイトは一般的にNULLに入力され、以下は使用状況を直接見る.
    
    TCHAR pWideStr = TEXT("*****");
    CHAR pMultiStr = NULL;
    int mlenByte = 0.
    mlenByte = WideCharToMultiByte(CP_UTF8, 0, pWideStr, -1, NULL, 0, NULL, NULL);
    //pMultiStr  
    pMultiStr = malloc(mlenByte * strlen(CHAR));
    mlenByte = WideCharToMultiByte(CP_UTF8, 0, pWideStr, -1, pMultiStr, lenByte, NULL, NULL);