跪求中文转unicode的C/MFC源码

emyueguang 2009-07-22 10:07:57
比如中文字符串
CString chinaStr = "你好 啊!"
转换出来的unicode字符串应该是:"4F60597D0020554AFF01",封装成一个函数就是:
CString unicodeStr = ChinaToUnicode(chinaStr);
//
跪求MFC源码,C的也可以,C++的不行!
...全文
392 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
emyueguang 2009-07-22
  • 打赏
  • 举报
回复
靠,最后那个大哥的代码有些太烦了,不符合偶写程序的原则啊,也不见得效率就比前面那个高啊,抱歉,有空再试一下吧
emyueguang 2009-07-22
  • 打赏
  • 举报
回复
后面这位大哥,您的代码还是不行啊
1.空格要显示的"0020",也是占个字节的,您搞成了一个字节,包括其它的任何的ASCII字符都得占两个字节
2.您的这个后面莫名其妙的多出了一个0
不管了,先结帐了,您再改一下吧,改对了另开贴送分,与本贴的分一样多
Conry 2009-07-22
  • 打赏
  • 举报
回复

int ChinaToUnicode(const char* pSrc, unsigned char* pDst, int nSrcLength)
{
int nDstLength; // UNICODE宽字符数目
WCHAR wchar[1024]; // UNICODE串缓冲区,这里写了固定值,可根据nSrcLength动态申请
unsigned char tmp[1024];// 临时缓冲区,这里写了固定值,可根据nSrcLength动态申请
memset(tmp,0,sizeof(tmp));

unsigned char* p=tmp;
// 字符串-->UNICODE串
nDstLength = MultiByteToWideChar(CP_ACP, 0, pSrc, nSrcLength, wchar, 1024);

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

//恢复指针
p=tmp;
const char tab[]="0123456789ABCDEF"; // 0x0-0xf的字符查找表

for (int i = 0; i < nDstLength*2; i++)
{
*pDst++ = tab[*p >> 4]; // 输出高4位
*pDst++ = tab[*p & 0x0f]; // 输出低4位
p++;
}

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


return nDstLength*2*2;
}


emyueguang 2009-07-22
  • 打赏
  • 举报
回复
嗯?这么快?OK,我先验证一下
emyueguang 2009-07-22
  • 打赏
  • 举报
回复
验证通过,结帐!最后一位大哥写的代码有误,我一开始也是用这种方法写的,能不改正一下啊,只要验证通过了,我另外开贴送分,言出必行,本人不眠的,呵呵,这个分先给marrco2005了,因为这个代码目前验证了没有错误
forimprove 2009-07-22
  • 打赏
  • 举报
回复

CString ChinaToUnicode(CString chinaStr)
{
CString strRet;
int nChar = MultiByteToWideChar(CP_ACP, 0, chinaStr, -1, NULL, 0);
wchar_t* pBuf = new wchar_t[nChar];
nChar = MultiByteToWideChar(CP_ACP, 0, chinaStr, -1, pBuf, nChar);
for (int i = 0; i < nChar; i++)
{
CString str;
str.Format(_T("%X"), sBuf[i]);
strRet += str;
}
delete []pBuf;
return strRet;
}
forimprove 2009-07-22
  • 打赏
  • 举报
回复

CString ChinaToUnicode(CString chinaStr)
{
CString strRet;
int nChar = MultiByteToWideChar(CP_ACP, 0, s, -1, NULL, 0);
wchar_t* pBuf = new wchar_t[nChar];
nChar = MultiByteToWideChar(CP_ACP, 0, s, -1, pBuf, nChar);
for (int i = 0; i < nChar; i++)
{
CString str;
str.Format(_T("%X"), sBuf[i]);
strRet += str;
}
delete []pBuf;
return strRet;
}
marrco2005 2009-07-22
  • 打赏
  • 举报
回复

CString ChinaToUnicode(LPCWSTR lpUnicode)
{
unsigned char *pCh = (unsigned char *) lpUnicode;
int nCount = wcslen( lpUnicode );
CString strResult;

for ( int i = 0; i < nCount * sizeof(WCHAR); i += 2 )
{
CString strTemp;
strTemp.Format( _T("%02X%02X"), pCh[i+1], pCh[i] );
strResult += strTemp;

}

return strResult;

}
emyueguang 2009-07-22
  • 打赏
  • 举报
回复
拜托,我要显示的是"4F60597D0020554AFF01",而不是原来的中文
marrco2005 2009-07-22
  • 打赏
  • 举报
回复
#include "atlconv.h"

void test()
{
USES_CONVERSION;
LPCWSTR lpUnicode = A2W("你好 啊!");
}
dronly 2009-07-22
  • 打赏
  • 举报
回复
#define UNICODE

TCHAR tmp[]=chinaStr;
CString rtStr=TEXT("");

unsigned int Count=sizeof(tmp);
for(unsigned int Index=0;Index<Count;Index++){
rtStr+=tmp[Index];
}

return rtStr;

随手写的,谢谢。

16,471

社区成员

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

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

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