用Base64编码UTF-8字符串(C语言)

//将ansi字符串转为UTF-8之后转为Base64编码供邮件使用
#include <stdio.h>
#include <windows.h>
#include <string>
#include "base64.h"
using namespace std;

int main()
{
string test1="輸入模式";
WCHAR test1_w[255]={0};
char test1_u8[255]={0};
//mb->wc
int len=MultiByteToWideChar(CP_ACP,0,test1.c_str(),-1,NULL,0);
MultiByteToWideChar(CP_ACP,0,test1.c_str(),-1,test1_w,len);
//wc->utf8
DWORD dwNum = WideCharToMultiByte(CP_UTF8,NULL,test1_w,-1,NULL,0,NULL,FALSE);
WideCharToMultiByte (CP_UTF8,NULL,test1_w, -1, test1_u8, dwNum,NULL,FALSE);
//encode
string test2 = base64_encode((const unsigned char *)test1_u8, strlen(test1_u8)+1);
}

有一个字符串需要以UTF-8字符集编码转换为Base64编码。解释一下以上代码。 test1是一个ansi字符串,通过 MultiByteToWideChar 函数将 test1 ansi字符串转换为 test1_w UTF-16 LE宽字符。然后又通过WideCharToMultiByte 将宽字符串转为UTF-8字符串 test1_u8。 然后通过base64_encode函数转为Base64编码。base64_encode函数来自 René Nyffeneggerhttp://www.adp-gmbh.ch/cpp/common/base64.html

"輸入模式"这四个繁体字的ANSI 16进制编码(中文系统也就是GBK编码)是

DD94 C8EB C4A3 CABD

转换成UTF-8的16进制编码是:

E8BCB8 E585A5 E6A8A1 E5BC8F

上文函数两次调用WideCharToMultiByte和两次调用MultiByteToWideChar 的第一次调用返回值是获取转换后编码buffer的字节数。len等于5,需要4个WCHAR+1个'\0'。 dwNum等于13,需要12 Bytes+1个'\0'。

标签: C语言, 字符集, Base64

添加新评论