> 文章列表 > MFC : 多字节、宽字节等之间的数据类型转换

MFC : 多字节、宽字节等之间的数据类型转换

MFC : 多字节、宽字节等之间的数据类型转换

目录

ATL 模板宏

W2A 转多字

A2W 转宽字节

A2T 转 CString

T2A 转 char *

TEXT 宏定义

CString 转换

int 转 CString

double 转 CString

CString 转 double

CString 转换 string

字符串转换

WideCharToMultiByte

BSTR 转换 string

DWORD

LPCSTR 长指针常量字符

LPCWSTR 常量宽字符指针

T2W 转换多字节 char *

A2CW 转换多字节


ATL 模板宏

  • #include <atlconv.h>

  • 宏定义:USES_CONVERSION

W2A 转多字节

    把 unicode 字符转换成 ansi 字符,宽字节转换为多字节

A2W 转宽字节

    多字节转换为宽字节,char * ==> wchar *

A2T 转 CString

    char * ==> CString

T2A 转 char *

    CString ==> char *

TEXT 宏定义

根据项目属性 —— 字符编码,进行自动编码类型

AfxMessageBox( TEXT( "注入成功!" ) );

CString 转换

int 转 CString

CString str;
int number = 15;// str="15"
str.Format(_T("%d"),number);

double 转 CString

// str="1.4600"
str.Format(_T("%.4f"),number);

CString 转 double

str = _ttof( "7000.000" ); // 7000.000

CString 与 string

注:const char* 类型可以直接给 CString 类型赋值

CString cstr;
string str = “asdasd”;
cstr = str.c_str();
CString cstr = “asdasd”;
string str = cstr;
const char * pchar = str.c_str();

宽字符串转换

WideCharToMultiByte

    此函数把宽字符串转换成指定的新的字符串,如ANSI,UTF8等,新字符串不必是多字节字符集。 (---Unicode 转 ANSI(GB2312),UTF8)

int WideCharToMultiByte(UINT CodePage, // 指定执行转换的代码页,可为系统已安装或有效的任何代码页所给定的值DWORD dwFlags, // 指定如何处理没有转换的字符,不设此函数会运行的更快些,设为 0 LPWSTR lpWideCharStr, // 待转换的宽字符串int cchWideChar, // 待转换宽字符串的长度,-1表示转换到字符串结尾LPCSTR lpMultiByteStr, // 接收转换后输出新串的缓冲区int cbMultiByte, // 输出缓冲区大小,若为0,lpMultiByteStr 将被忽略,// 函数将返回所需缓冲区大小而不使用 lpMultiByteStrLPCSTR lpDefaultChar, // 指向字符的指针,找不到相应字符时此字符为默认字符代替。// 如果为 NULL 则使用系统默认字符。// NULL 的 dwFlags 用此参数,失败并设置错误码ERROR_INVALID_PARAMETERPBOOL pfUsedDefaultChar // 开关变量的指针,用以表明是否使用过默认字符。
// NULL 的 dwFlags 使用此参数,失败并设置错误码ERROR_INVALID_PARAMETER。
// lpDefaultChar 和 lpUsedDefaultChar 都设为 NULL,函数会更快一些。); 
// cbMultiByte 非 0,返回写入 lpMultiByteStr 的字节数(包括字符串结尾的null);
// cbMultiByte 为 0,则返回转换所需字节数,函数失败,返回 0。
参数 参数值 作用
CodePage CP_ACP 当前系统ANSI代码页
CP_MACCP 当前系统Macintosh代码页
CP_OEMCP 当前系统OEM代码页,一种原始设备制造商硬件扫描码
CP_SYMBOL 符号代码页
CP_THREAD_ACP 当前线程ANSI代码页
dwFlags WC_NO_BEST_FIT_CHARS 把不能直接转换成相应多字节字符的 Unicode 字符转换成 lpDefaultChar 指定的默认字符。
WC_ERR_INVALID_CHARS 此选项会致使函数遇到无效字符时失败返回,并且 GetLastError 会返回错误码ERROR_NO_UNICODE_TRANSLATION。否则函数会自动丢弃非法字符。此选项只能用于 UTF8。
WC_COMPOSITECHECK 把合成字符转换成预制的字符。
它可以与后三个选项中的任何一个组合使用,如果没有与他们中的任何一个组合,则与选项 WC_SEPCHARS 相同。
WC_DISCARDNS 转换时丢弃不占空间的字符
WC_SEPCHARS 转换时产生单独的字符,此是默认转换选项
WC_DEFAULTCHAR 转换时使用默认字符代替例外的字符,(最常见的如’?’)

BSTR 转换 string

BSTR dval;
// VarArray.GetStringByIndex( i, &dval );
variableNumber.push_back( _com_util::ConvertBSTRToString( dval ) );

DWORD

    Double word,unsigned long,每个 word 为 2 个字节的长度,DWORD 为 4 个字节,每个字节 8 位,共 32 位,属于 MFC 的数据类型。

LPCSTR 长指针常量字符串

    LPCSTR 是 win32 和 VC++ 所使用的一种字符串数据类型,L 表示 long,P 表示指针,C 表示常量,STR 表示字符串。

/// 1 LPCSTR 转 CString
LPCSTR lpStr = "text";
CString str(lpStr);/// 2 CString 转 LPCSTR
CString cstr("text");
LPCSTR lpstr = (LPCSTR)cstr.GetBuffer(cstr.GetLength());

LPCWSTR 常量宽字符指针

T2W 转换多字节 char *

char* szStr = "测试字符串";     
CString str = CString(szStr);
USES_CONVERSION;
LPCWSTR wszClassName = new WCHAR[str.GetLength()+1];
wcscpy((LPTSTR)wszClassName,T2W((LPTSTR)str.GetBuffer(NULL)));    
str.ReleaseBuffer();

A2CW 转换多字节

char* szStr = "测试字符串";     
CString str = CString(szStr);
USES_CONVERSION;
LPCWSTR wszClassName = A2CW(W2A(str));
str.ReleaseBuffer();