封装多字节与宽字节之间转换函数
在windows平台下,大多数编译器默认为多字节,但仍然有需要用到宽字节的时候,此时需要注意多字节与宽字节之间转换的问题,否则中文会乱码
#pragma once
#include<windows.h>
/*需要使用的转换码
CP_UTF8: 使用UTF-8转换
CP_ACP: ANSI字符集
CP_THREAD_ACP: ANSI字符集;
*/
/*--------------------------------------------------------------------------------------*/
LPWSTR Multibyte_TO_Widebyte(LPCSTR m_achar,UINT CodePage= CP_UTF8)
{
int len = MultiByteToWideChar(CodePage, 0, m_achar, strlen(m_achar), NULL, 0);
LPWSTR m_wchar = new WCHAR[len + 1];
if (m_wchar != NULL) {//防止new失败的情况
MultiByteToWideChar(CodePage, 0, m_achar, strlen(m_achar), m_wchar, len);
m_wchar[len] = '\0';
return m_wchar;
}
return m_wchar;
}
/*--------------------------------------------------------------------------------------*/
LPSTR Widebyte_TO_Multibyte(LPCWSTR m_wchar,UINT CodePage= CP_ACP)
{
int len = WideCharToMultiByte(CodePage, 0, m_wchar, wcslen(m_wchar), NULL, 0, NULL, NULL);
LPSTR m_achar = new CHAR[len + 1];
if (m_achar != NULL) {//防止new失败的情况
WideCharToMultiByte(CodePage, 0, m_wchar, wcslen(m_wchar), m_achar, len, NULL, NULL);
m_achar[len] = '\0';
return m_achar;
}
return m_achar;
}
原理:
MultiByteToWideChar()函数先计算多字节字符串m_achar的大小,然后再用new出来的m_wchar接收MultiByteToWideChar()转换后的宽字节字符串。
Widebyte_TO_Multibyte()同理