工作一年多来跟编码格式打了好几次交道了,感觉没有遇到的问题都有那么点不一样,window 编程中大多说的编码转换问题都通过A2T 解决了,但是最近遇到了一个A2T 解决不了的,然后就找到了他们的根MultiByteToWideChar 与WideCharToMultiByte
其实这就是Unicode(宽字节)和ANSI(多字节)字符串转换的问题。
MultiByteToWideChar:将多字节字符串转化为宽字符字符串(函数将Unicode 编码的字符串写入内存缓冲区,返回缓冲区的长度)
int MultiByteToWideChar(
UINT uCodePage,
DWORD dwFlags,
PCSTR pMultiByteStr,
int cbMultiByte,
PWSTR pWideCharStr,
int 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);