网站首页  |   业界社区  |  电信社区  |  技术社区   |  极客社区  |  游戏社区  |  生活社区   |   科技博客  |   同事录
TechWeb-技术社区


标题: [求助] VxWorks中关于GB2312转换成UTF-8的问题
OKBEN
TW金牌会员
Rank: 6Rank: 6



UID 138713
精华 37
积分 1469
帖子 584
阅读权限 70
注册 2008-7-29
状态 离线
发表于 2008-8-20 10:48 资料 短消息 加为好友 添加 OKBEN 为MSN好友 通过MSN和 OKBEN 交谈
VxWorks中关于GB2312转换成UTF-8的问题

请教各位,我现已将汉字取十六进制值,得到GB2312码,现将该码转换成utf-8码,该如何实现,请帮忙写个代码赐教!

引用 回复 顶部
游客
该用户匿名发帖









发表于 2008-8-20 10:48
有直接开源的代码iconv 可以直接使用

引用 回复 顶部
游客
该用户匿名发帖









发表于 2008-8-20 10:48
晕死,大哥,这个iconv我看了在linux下面才有的啊,vxworks里没有发现,请问大哥能提供一份吗?谢谢!

引用 回复 顶部
游客
该用户匿名发帖









发表于 2008-8-20 10:48
转一个帖子,看看有没有启发!
/~7J H6u t0d1Y!~*k#?(V6](c"@3n'k:A @
C/C++ code
)J(p.Q,u&?tech.techweb.com.cn
1s;j&|$U'y)a*S#H    字符集之间转换(UTF-8,UNICODE,Gb2312) 特搜集了UTF-8,UNICODE,Gb2312他们3个之间的相互转换. UTF-8: 3字节一个字符 UNICODE: 2字节一个字符 GB2312: 1字节一个字符 例子: “你”字的UTF-8编码: E4 BD A0        11100100 10111101 10100000 “你”的Unicode编码: 4F 60          01001111 01100000 按照UTF-8的编码规则,分解如下:xxxx0100 xx111101 xx100000 把除了x之外的数字拼接在一起,就变成“你”的Unicode编码了。注意UTF-8的最前面3个1,表示整个UTF-8串是由3个字节构成的。经过UTF-8编码之后,再也不会出现敏感字符了,因为最高位始终为1。 类定义 class CChineseCode { public: static void UTF_8ToUnicode(wchar_t* pOut,char *pText); // 把UTF-8转换成Unicode static void UnicodeToUTF_8(char* pOut,wchar_t* pText); //Unicode 转换成UTF-8 static void UnicodeToGB2312(char* pOut,wchar_t uData); // 把Unicode 转换成 GB2312 static void Gb2312ToUnicode(wchar_t* pOut,char *gbBuffer);// GB2312 转换成 Unicode static void GB2312ToUTF_8(string& pOut,char *pText, int pLen);//GB2312 转为 UTF-8 static void UTF_8ToGB2312(string &pOut, char *pText, int pLen);//UTF-8 转为 GB2312 }; 类实现 void CChineseCode::UTF_8ToUnicode(wchar_t* pOut,char *pText) { char* uchar = (char *)pOut; uchar[1] = ((pText[0] & 0x0F) << 4) + ((pText[1] >> 2) & 0x0F); uchar[0] = ((pText[1] & 0x03) << 6) + (pText[2] & 0x3F); return; } void CChineseCode::UnicodeToUTF_8(char* pOut,wchar_t* pText) { // 注意 WCHAR高低字的顺序,低字节在前,高字节在后 char* pchar = (char *)pText; pOut[0] = (0xE0 | ((pchar[1] & 0xF0) >> 4)); pOut[1] = (0x80 | ((pchar[1] & 0x0F) << 2)) + ((pchar[0] & 0xC0) >> 6); pOut[2] = (0x80 | (pchar[0] & 0x3F)); return; } void CChineseCode::UnicodeToGB2312(char* pOut,wchar_t uData) { WideCharToMultiByte(CP_ACP,NULL,&uData,1,pOut,sizeof(wchar_t),NULL,NULL); return; } void CChineseCode::Gb2312ToUnicode(wchar_t* pOut,char *gbBuffer) { ::MultiByteToWideChar(CP_ACP,MB_PRECOMPOSED,gbBuffer,2,pOut,1); return ; } void CChineseCode::GB2312ToUTF_8(string& pOut,char *pText, int pLen) { char buf[4]; int nLength = pLen* 3; char* rst = new char[nLength]; memset(buf,0,4); memset(rst,0,nLength); int i = 0; int j = 0; while(i < pLen) { //如果是英文直接复制就可以 if( *(pText + i) >= 0) { rst[j++] = pText[i++]; } else { wchar_t pbuffer; Gb2312ToUnicode(&pbuffer,pText+i); UnicodeToUTF_8(buf,&pbuffer); unsigned short int tmp = 0; tmp = rst[j] = buf[0]; tmp = rst[j+1] = buf[1]; tmp = rst[j+2] = buf[2]; j += 3; i += 2; } } rst[j] = '\0'; //返回结果 pOut = rst; delete []rst; return; } void CChineseCode::UTF_8ToGB2312(string &pOut, char *pText, int pLen) { char * newBuf = new char[pLen]; char Ctemp[4]; memset(Ctemp,0,4); int i =0; int j = 0; while(i < pLen) { if(pText > 0) { newBuf[j++] = pText[i++]; } else { WCHAR Wtemp; UTF_8ToUnicode(&Wtemp,pText + i); UnicodeToGB2312(Ctemp,Wtemp); newBuf[j] = Ctemp[0]; newBuf[j + 1] = Ctemp[1]; i += 3; j += 2; } } newBuf[j] = '\0'; pOut = newBuf; delete []newBuf; return;

引用 回复 顶部
游客
该用户匿名发帖









发表于 2008-8-20 10:49
既然linux里面有,那就移植过来吧

引用 回复 顶部
游客
该用户匿名发帖









发表于 2008-8-20 10:49
代码转换与系统没有直接关系,linux下有源码,你就移植吧,估计不需要做改动的。

引用 回复 顶部
游客
该用户匿名发帖









发表于 2008-8-20 10:49
汗,这玩意能移植吗?诶,我汗哪~~~~接着跪求解决算法!

引用 回复 顶部
游客
该用户匿名发帖









发表于 2008-8-20 10:49
其实所谓移植就是先看懂linux下的代码,然后将其重新封装成Vxworks下的一个函数就行,代码基本不用改的。
"?-[6W"d(l!X$cTechWeb-技术社区至于算法,代码里面已经实现了的。
5`7h.r6Z0l$s6R/v/_8atech.techweb.com.cn
3E7u5N;s,R3E/`程序开发,操作系统,服务器,源码下载,Linux,Unix,BSD,PHP,Apach,asp,下载,源码,黑客,安全,技术社区,技术论坛你是想要一个函数?还是想自己学算法,自己写函数呢?

引用 回复 顶部
游客
该用户匿名发帖









发表于 2008-8-20 10:49
就是想要一个能够实现功能的函数,自己能够再程序中调用实现就行,跪求各位哥哥此招赐招呀!

引用 回复 顶部
游客
该用户匿名发帖









发表于 2008-8-20 10:49
3楼的linco_gp 给出的程序看一看,不过其中用到的是WinAPI,你可以参考。
8`4E4m(e0|8a主体结构不需要改变,只要将MultiByteToWideChar,WideCharToMultiByte等替换成VxWorks下的API即可。#_1O4e,M(~
不过,可别告诉我VxWorks下面没有窄字符和宽字符进行转换的API呀。如果真没有,那真的只能从最小处开始写了。

引用 回复 顶部
查看积分策略说明快速回复主题
选项 标题 Smilies
禁用 URL 识别
禁用 Smilies
禁用 Discuz!代码
使用匿名发帖
使用个人签名
接收新回复邮件通知
内容





当前时区 GMT+8, 现在时间是 2008-11-23 05:33
京ICP证060517号

本论坛支付平台由支付宝提供
携手打造安全诚信的交易社区 Powered by Discuz! 5.5.0 © 2001-2008 Comsenz Inc.
Processed in 0.031446 second(s), 7 queries

清除 Cookies - 联系我们 - TechWeb.com.cn - Archiver - WAP