用vc做了一个邮件解读的程序,但是在编码问题上出现了乱码,具体问题是:如在解析邮件头部内容时,如主题“Subject: =?utf-8?B?5qyi6L+O5L2/55SoIOKAnOS5kOmaj+S6q+KAnQ==?=”,采用base64编码进行解码,出现乱码。
将这个主题中的“5qyi6L+O5L2/55SoIOKAnOS5kOmaj+S6q+KAnQ”在在线解码中用base64解码能够正确显示,但在程序中用base64解码就乱了,主要原因应该是前面有一个“utf-8”,表示是utf-8字符集,而不是“gb2312”。
请教高手,这种问题如何解决?谢谢!
将这个主题中的“5qyi6L+O5L2/55SoIOKAnOS5kOmaj+S6q+KAnQ”在在线解码中用base64解码能够正确显示,但在程序中用base64解码就乱了,主要原因应该是前面有一个“utf-8”,表示是utf-8字符集,而不是“gb2312”。
请教高手,这种问题如何解决?谢谢!
{
int len = 0;
len = (int)str.length();
int unicodeLen = ::MultiByteToWideChar( CP_UTF8,
0,
str.c_str(),
-1,
NULL,
0 );
wchar_t * pUnicode;
pUnicode = new wchar_t[unicodeLen+1];
memset(pUnicode,0,(unicodeLen+1)*sizeof(wchar_t));
::MultiByteToWideChar( CP_UTF8,
0,
str.c_str(),
-1,
(LPWSTR)pUnicode,
unicodeLen );
wstring rt;
rt = ( wchar_t* )pUnicode;
delete pUnicode; return rt;
}
“Subject: =?utf-8?B?5qyi6L+O5L2/55SoIOKAnOS5kOmaj+S6q+KAnQ==?=”
你的subject制定为Utf-8字符集, 加密方式为base64, 乱码可能是你传入的字符集不是utf-8的, 客户端解释时按默认解释就错了。 你试着把utf-8改为gb2312看下效果, 如果正确, 你要把你传入的字符串用MultiCharToWideChar转为uft-8.
http://blog.csdn.net/muzizongheng/archive/2009/10/15/4675651.aspx
下面是需要解析的邮件头部部分信息(邮件被导出被保存在一个文本文件中),其中显示字符集是utf-8,编码是base64:
Message-Id: <[email protected]>
MIME-Version: 1.0
From: [email protected]
Date: 19 Aug 2010 12:51:51 +0100
Subject: =?utf-8?B?5qyi6L+O5L2/55SoIOKAnOS5kOmaj+S6q+KAnQ==?=
Content-Type: text/html; charset=utf-8
Content-Transfer-Encoding: base64
X-Nokia-AV: Clean
我在程序中,需要读取被保存在文本文件中的邮件文件,分别提取邮件的头部信息,对被编码过的头部信息要解码,如对这个subject中的编码要解码掉。我有一个base64的解码函数base64_decode(),完成对base64编码的解码。在提取这个subject后,分析其被编码,并将“=?utf-8?B?”部分去掉,并去掉subject尾部的“=?=”,再调用base64_decode()函数对“5qyi6L+O5L2/55SoIOKAnOS5kOmaj+S6q+KAnQ=”部分解码,程序如下:
startPos = Subject.Find("?B?");
if (startPos < 0)
{
startPos = Subject.Find("?b?");
} if (startPos > 0)
{
while (startPos > 0)
{
//编码结束的位置
endPos = Subject.Find("?=",startPos);
//提取编码过的字符串
Subject.Delete(0,startPos + 3);
temp_Name = Subject.Left(endPos - startPos - 3);
temp_Name.Replace("\r\n","");
int Name_len = temp_Name.GetLength();
temp_Name.Format("%s",base64.base64_decode(temp_Name.GetBuffer(Name_len),Name_len));
AfxMessageBox("temp name:"+temp_Name); Name = Name+temp_Name; startPos = Subject.Find("?B?");
if (startPos < 0)
{
startPos = Subject.Find("?b?");
}
}
}
最终的结果AfxMessageBox显示出的信息是乱码,如果charset为gb2312的话,解码是没有问题的,但这里面要处理的是utf-8,所以乱码了,这个字符集需要怎么处理,还没搞清楚。请指教,谢谢。
你把temp_Name转换为多字节,
char szTemp1[8096] = {NULL};
WideCharToMultiByte(CP_ACP, 0, temp_Name.GetBuffer(0), -1, szTemp1, 8095, NULL, NULL );
temp_Name = CString(szTemp1);然后再调用AfxMessageBox(base64.base64_decode(temp_Name.GetBuffer(Name_len),Name_len)); 看看。
WideCharToMultiByte(CP_ACP, 0, temp_Name.GetBuffer(0), -1, szTemp1, 8095, NULL, NULL );
temp_Name = CString(szTemp1);上面处理后Name_len要重新获取。
Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast”,类型转换的问题,用强制转换好像也不行
USES_CONVERSION;
LPSTR strFrom = W2A(temp_Name.GetBuffer(0));
char szTemp[8096] = {NULL};
WideCharToMultiByte(CP_UTF8, 0, temp_Name.GetBuffer(0), -1, szTemp, 8095, NULL, NULL ); 本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/muzizongheng/archive/2009/10/15/4675651.aspx
鼠标点击WideCharToMultiByte(CP_UTF8, 0, temp_Name.GetBuffer(0), -1, szTemp, 8095, NULL, NULL )的temp_Name.GetBuffer(0)上面,显示是unsigned short *类型,但就是编译通不过