在线等!!如何对gb2312编码的内容转换??

talkingmute 2006-03-29 09:29:14
比如,这样的gb2312字符,?gb2312?B?Rnc6ICjI8NDHzOHKvi20y9PKvP6/ycTcysfArLv408q8/ik2MLbgs8fK0KOsyOe2q924?=
它实际的内容是一些中文,怎么把那些中文给显示出来??
...全文
247 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
bjskyhorse 2006-04-03
  • 打赏
  • 举报
回复
抱歉,贴错代码了。那两个函数,第一个是把比方中文“你好”变成对应的UCS2码,第二个是吧UCS2变成对应的中文。还应该有这么段:

int gsmBytes2String(const unsigned char* pSrc, char* pDst, int nSrcLength)
{
const char tab[]="0123456789ABCDEF"; // 0x0-0xf的字符查找表

for(int i=0; i<nSrcLength; i++)
{
// 输出低4位
*pDst++ = tab[*pSrc >> 4];

// 输出高4位
*pDst++ = tab[*pSrc & 0x0f];

pSrc++;
}

// 输出字符串加个结束符
*pDst = '\0';

// 返回目标字符串长度
return nSrcLength * 2;


}
就是把字节"\xd5\xd6"变成d5d6,然后再转换吧。
cai114 2006-03-30
  • 打赏
  • 举报
回复
这个我也想知道,帮顶!
talkingmute 2006-03-29
  • 打赏
  • 举报
回复
怎么没人回答啊?急啊!!
talkingmute 2006-03-29
  • 打赏
  • 举报
回复
to:nkwesley(江南丝竹)
谢谢,能说明下您那段代码怎么调用吗?还有atlenc.h在我的vc目录中找不到。
talkingmute 2006-03-29
  • 打赏
  • 举报
回复
可以运行了,我上边的代码有问题,字符指针未初始化,这是改后的:
CString str;
unsigned char* pd=new u_char[1000];
int pdl=0;
char *rpd=new char[1000];
GetDlgItem(IDC_EDIT2)->GetWindowText(str);
pdl=gsmEncodeUcs2(str.GetBuffer(str.GetLength()),pd,str.GetLength());
str.ReleaseBuffer();
gsmBytes2String(pd,rpd,pdl);
AfxMessageBox(rpd);
delete pd;
delete rpd;
pd=NULL;
rpd=NULL;

把上边刚开始的那一串gb2312编码放进来,最后返回的内容都是十六进制的数,不是原始的中文汉字??请问,下步该怎么转换呢??如何能把汉字显示出来?希望大家能帮助下!谢谢!
nkwesley 2006-03-29
  • 打赏
  • 举报
回复
使用Base64Decode函数
#include <atlenc.h>

void CMyDlg::OnBnClickedButton19()
{
CString s = "xvPStbnixcw=";
BYTE *pBuf = new BYTE[128];
memset(pBuf,0,128);
int len = 128;
Base64Decode(s.GetBuffer(),s.GetLength(),pBuf,&len);
CString o = (char*)pBuf;
AfxMessageBox(o);
}
nkwesley 2006-03-29
  • 打赏
  • 举报
回复
unsigned char p[129];; //接受缓冲区

   ZeroMemory(p,sizeof(p));; //接收缓冲区清零

int widecharlen=MultiByteToWideChar( //计算从Ansi转换到Unicode后需要的字节数

   CP_ACP,

   MB_COMPOSITE,

   (char*)p, //要转换的Ansi字符串

   -1, //自动计算长度

   0,

   0

   );;

   CString tmpstr;;

   tmpstr.GetBuffer(widecharlen);; //为转换后保存Unicode字符串分配内存

   MultiByteToWideChar( //从Ansi转换到Unicode字符

   CP_ACP,

   MB_COMPOSITE,

   (char*)p,

   -1,

   tmpstr.GetBuffer(widecharlen), //转换到tmpstr

   widecharlen //最多转换widecharlen个Unicode字符

   );;
talkingmute 2006-03-29
  • 打赏
  • 举报
回复
to bjskyhorse() :
您好,谢谢!这是参考您的函数写的,可是一运行就提示程序遇到问题要关闭,请问是哪里有问题???
CString str;
unsigned char* pd=NULL;
int pdl=0;
char *rpd=NULL;
GetDlgItem(IDC_EDIT2)->GetWindowText(str);
pdl=gsmEncodeUcs2(str.GetBuffer(str.GetLength()),pd,str.GetLength());
str.ReleaseBuffer();
gsmBytes2String(pd,rpd,pdl);
AfxMessageBox(rpd);
bjskyhorse 2006-03-29
  • 打赏
  • 举报
回复

// pSrc: 源字符串指针
// pDst: 目标编码串指针
// nSrcLength: 源字符串长度
// 返回: 目标编码串长度
int gsmEncodeUcs2(const char* pSrc, unsigned char* pDst, int nSrcLength)
{
int nDstLength; // UNICODE宽字符数目
WCHAR wchar[128]; // UNICODE串缓冲区

// 字符串-->UNICODE串
memset(wchar,0,128);// I added
nDstLength = ::MultiByteToWideChar(CP_ACP, 0, pSrc, nSrcLength, wchar, 128);

// 高低字节对调,输出
for(int i=0; i<nDstLength; i++)
{
// 先输出高位字节
*pDst++ = wchar[i] >> 8;
// 后输出低位字节
*pDst++ = wchar[i] & 0xff;
}

// 返回目标编码串长度
return nDstLength * 2;
}

// 字节数据转换为可打印字符串
// 如:{0xC8, 0x32, 0x9B, 0xFD, 0x0E, 0x01} --> "C8329BFD0E01"
// pSrc: 源数据指针
// pDst: 目标字符串指针
// nSrcLength: 源数据长度
// 返回: 目标字符串长度
int gsmBytes2String(const unsigned char* pSrc, char* pDst, int nSrcLength)
{
const char tab[]="0123456789ABCDEF"; // 0x0-0xf的字符查找表

for(int i=0; i<nSrcLength; i++)
{
// 输出低4位
*pDst++ = tab[*pSrc >> 4];

// 输出高4位
*pDst++ = tab[*pSrc & 0x0f];

pSrc++;
}

// 输出字符串加个结束符
*pDst = '\0';

// 返回目标字符串长度
return nSrcLength * 2;


}
whuwdj 2006-03-29
  • 打赏
  • 举报
回复
顶一下
talkingmute 2006-03-29
  • 打赏
  • 举报
回复
to:bjskyhorse()
麻烦您能给这几个函数的作用说下吗?我怎么看的有些晕晕的,能把它们连起来给讲下吗?
谢谢!!
bjskyhorse 2006-03-29
  • 打赏
  • 举报
回复
少了一个,用这个把对应的再处理一下..
int gsmDecodeUcs2(const unsigned char* pSrc, char* pDst, int nSrcLength)
{
int nDstLength; // UNICODE宽字符数目
WCHAR wchar[128]; // UNICODE串缓冲区

// 高低字节对调,拼成UNICODE
for(int i=0; i<nSrcLength/2; i++)
{
// 先高位字节
wchar[i] = *pSrc++ << 8;

// 后低位字节
wchar[i] |= *pSrc++;
}

// UNICODE串-->字符串
nDstLength = ::WideCharToMultiByte(CP_ACP, 0, wchar, nSrcLength/2, pDst, 160, NULL, NULL);

// 输出字符串加个结束符
pDst[nDstLength] = '\0';

// 返回目标字符串长度
return nDstLength;
}
// UCS2编码
// pSrc: 源字符串指针
// pDst: 目标编码串指针
// nSrcLength: 源字符串长度
// 返回: 目标编码串长度
int gsmEncodeUcs2(const char* pSrc, unsigned char* pDst, int nSrcLength)
{
int nDstLength; // UNICODE宽字符数目
WCHAR wchar[128]; // UNICODE串缓冲区

// 字符串-->UNICODE串
memset(wchar,0,128);// I added
nDstLength = ::MultiByteToWideChar(CP_ACP, 0, pSrc, nSrcLength, wchar, 128);

// 高低字节对调,输出
for(int i=0; i<nDstLength; i++)
{
// 先输出高位字节
*pDst++ = wchar[i] >> 8;
// 后输出低位字节
*pDst++ = wchar[i] & 0xff;
}

// 返回目标编码串长度
return nDstLength * 2;
}

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧