MultiByteToWideChar 与WideCharToMultiByte

工作一年多来跟编码格式打了好几次交道了,感觉没有遇到的问题都有那么点不一样,window 编程中大多说的编码转换问题都通过A2T 解决了,但是最近遇到了一个A2T 解决不了的,然后就找到了他们的根MultiByteToWideChar 与WideCharToMultiByte

其实这就是Unicode(宽字节)和ANSI(多字节)字符串转换的问题。

MultiByteToWideChar:将多字节字符串转化为宽字符字符串(函数将Unicode 编码的字符串写入内存缓冲区,返回缓冲区的长度

int MultiByteToWideChar(
    UINT uCodePage,
    DWORD dwFlags,
    PCSTR pMultiByteStr,
    int cbMultiByte,
    PWSTR pWideCharStr,
    int cchWideChar
);
  • uCodePage 标识了与多字节字符串关联的一个代码页值(CP_UTF8, 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
);

由定义可知,前六个参数与MultiByteToWideChar 中的六个参数想对应,使用方法也一致,后两个字节一般传入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);

 

你可能感兴趣的:(编码)