unicode编码转换成GBK编码的算法,用C如何实现?

wen587420051 2007-10-22 02:27:00
unicode编码转换成GBK编码的算法,用C如何实现?

如题,这个算法如何实现?谢谢 !!!
...全文
1957 46 打赏 收藏 转发到动态 举报
写回复
用AI写文章
46 条回复
切换为时间正序
请发表友善的回复…
发表回复
wen587420051 2007-10-24
  • 打赏
  • 举报
回复
加了,不好意思,学习习惯不好!!改正!!!


还有个问题,我调了很久, string 转换成wchar_t
iambic 2007-10-24
  • 打赏
  • 举报
回复
iconv
goole
xinai0521 2007-10-24
  • 打赏
  • 举报
回复
wen587420051 LZ。
!如果你要自己做一个GBK与UNICODE转换的话(没有系统平台给你依托),就是用查表法,GBK与UNICODE码对应该你可以上UNICODE网站去下载~有的~(网站也有,如果找不到,我可以发给你 MSN:songxinai0521@hotmail.com)
如果WINDOWS下面的话。用WideCharToMultiByte和MultiByteToWideChar函数! 就可以搞定了~
具体参数见MSDN或者上网查一查,有很多说明的。不难!
多做多想之后再问~
danteliujie 2007-10-24
  • 打赏
  • 举报
回复


string str;
whcar_t *p = str.c_str();
wen587420051 2007-10-24
  • 打赏
  • 举报
回复
STL还不是很了解,学这个要看哪些资料?

wstring ws(s.begin(), s.end()); WS里的东西每次结果都不一样,也不是正确的,怎样获取这个变了的值?谢谢!
iambic 2007-10-24
  • 打赏
  • 举报
回复
string s;
wstring ws(s.begin(), s.end());
yixiao386 2007-10-23
  • 打赏
  • 举报
回复
不好意思,我说的确实是linux下的 不过windows下的也有的 按照20楼朋友说的操作就可以了 或者去网上再找下win32下的转换函数
xinai0521 2007-10-23
  • 打赏
  • 举报
回复
除了查表,可以说别无它法!
你去看看LINUX源实现!就知道了。。WINDOWS的API实现也是一样的,通过查表求出来。
/linux-2.4.34.1/fs/nls(你可以去看Fodora6,他支持GBK13800),很有仔细实现方法!都是用查表法去实现的。!
zhangyanli 2007-10-23
  • 打赏
  • 举报
回复
想问一下,这些问题作什么用啊

我怎么从来没碰到过啊
loops 2007-10-23
  • 打赏
  • 举报
回复
0xFFFE是UTF-16 的BOM, 用来标识下面的内容是个UTF-16的串,一般都放在文件的最开始的两个字节。
danteliujie 2007-10-23
  • 打赏
  • 举报
回复

顶,同问25楼的问题,哪个0xFFFE是什么东西?
danteliujie 2007-10-23
  • 打赏
  • 举报
回复


汗,你到msdn2.microsoft.com上去看搜索以下这个函数名就可以得到相关的所有内容
wen587420051 2007-10-23
  • 打赏
  • 举报
回复
谁知道WideCharToMultiByte 方法的具体参数,有些看着不明白,为什么根据那几个数字就可以....换成其他的编码转换需要哪些参数??谢谢
wen587420051 2007-10-23
  • 打赏
  • 举报
回复
to:xinai0521


很多人都说用查表方法 ,具体应该从哪着手做????


哪种方法最好!!~~```我只是做个接口而已.
wen587420051 2007-10-23
  • 打赏
  • 举报
回复
一个去掉0xFF0xFE 的 unicode编码进去,能得到一个正确对应的ASCII码.
danteliujie 2007-10-23
  • 打赏
  • 举报
回复

不太了解状况,去掉0xFF0xFE对了?
还有什么不对?
wen587420051 2007-10-23
  • 打赏
  • 举报
回复
to: danteLiujie

去掉0xFF0xFE测试了一些汉字是对的!!!感谢!!~~````我再看看其他的.
#include <Windows.h>

#define CODE_PAGE_GB18030 54936

int Unicode2GBK( wchar_t *pUnicode, char** ppDest)
{
// get the size of the dest string
const int size = ::WideCharToMultiByte( CODE_PAGE_GB18030,
0/* you can do more for it*/, pUnicode, -1, 0, 0, 0, 0 );

if ( size == 0 )
{
return -1;
}
char* pDestString = new char[size + 2];
::memset( pDestString, 0, sizeof(pDestString) );

// transform
int ret = ::WideCharToMultiByte( CODE_PAGE_GB18030, 0, pUnicode, -1, pDestString, size, 0, 0 );

if( ret == 0 )
{
delete pDestString;
return -1;
}
else
{
*ppDest = pDestString;
return 0;
}
}
danteliujie 2007-10-23
  • 打赏
  • 举报
回复


to:wen587420051
怎么不对了?呵呵,又没有试过把加上或者去掉0xFF0xFE,又没有用过loops的程序,呵呵,又没有全部读懂啊,呵呵,耐心,现在至少能出来东西,
想办法验证输入的字符是不是Unicode,最好能找各种字符的码字比较表来看转出来的结果是不是对
先写一个不与你的软件其他部分相关的的程序,贴出来让大家帮你查错误
danteliujie 2007-10-23
  • 打赏
  • 举报
回复

回zhangyanli,我遇到过是在两种情况,第一次是某次需要一种字库,但是对方是用unicode索引的,而我只有GB2312
第二次是做一个下载程序,得到的地址千奇百怪,要转换才能用
wen587420051 2007-10-23
  • 打赏
  • 举报
回复
to:danteLiujie


调出来的结果不对...
加载更多回复(26)
2002年写的一个共享软件,用到了actbar2.ocx,请自行下载或安装个actbar3来替换。 《内码转换精灵》2.0.0 测试版 软件使用说明 Convert Fairy 2.0.0 Bata 《内码转换精灵》是有其前身ConvFairy,内码转换控件演变而来。 其发行平台为:Windows98/Me/2000/XP。 内码转换精灵软件由张庆设计,软件作者保留所有的权利。 内码转换精灵软件的主要功能为: 1、内码转换。提供了GB码、Big5码、Gbk码、UniCode码间的相互转换功能,并提供Big5码到CNS的转换。 通过该软件可以批量的转换特定编码的文档。 支持的转换方式有以下14种: 1. GbToBig 将Gb2312码转换为Big5码 2. BigToGb 将Big5码转换为Big5码 3. GbkToBig 将Gbk码转换为Big5码 4. BigToGbk 将Big5码转换为Gbk码 5. UscToBig 将Unicode码转换为Big5码 6. BigToUsc 将Big5码转换为Unicode码 7. GbkToUsc 将Gbk吗转换为Unicode码 8. UscToGbkUnicode转换为Gbk码 9. GbkToUscWide 将Gbk码以全角形式转换为Unicode码(如有半角的英文字符,将先转换为全角) 10. UscToGbkNarrow 将Unicode码转换为Gbk码(半角的英文字符不会被转换) 11. UscToBigNarrow 将Unicode码转换为Big码(半角的英文字符不会被转换) 12. BigToUscWide 将Big码以全角的形式转换为Unicode码(如有半角的英文字符,将先转换为全角) 13. BigToCNS 将Big5码转换为CNS码(倚天码) 14. GbToBigToGbk 将Gb2312先转换为Big5码,然后将转换的Big5转换为Gbk码 2、多转换方式。 支持剪贴板转换。将剪贴板的内容按指定的转换方式进行转换。(只支持剪贴板内容是文本的情况) 文件预览。将指定的文件以只读方式进行转换并显示。 文件批量转换。将选定的一个或多个源文件按指定的转换方式转换后保存在目标文件夹中。 版本更新说明: 1.0-1.31版本 名为ConvFairy,是一个多内码转换控件。 2.X版本 对UnicodeGbk,Big,Gb2312码的转换算法做了大幅度修改,执行效率大大提高。 将其以应用程序的形式进行发布,适合更广大的用户群体。 使用许可协议: 《内码转换精灵》2.0.0 测试版 为免费版本,个人用户可免费使用,并任意分发,但当如果您需要将其用于商业 目的,必须事先通过张庆本人许可。请将使用情况电子邮件发送到webmaster007@163.com 对于使用《内码转换精灵》2.0.0 测试版的用户,而造成的任何损失,应由使用者自己承担风险。 软件作者张庆保留对使用许可协议的全部权利。 其他版本的使用许可协议请参考《内码转换精灵》软件许可协议。license.txt 版权所有 (C) 2002-2003 张庆
本模块支持GBKUNICODE、UTF-8三种编码之间的互相转换,不依赖系统Api,通过查表和编码算法直接得出转码结果,支持多线程调用。 编码小科普 GBK编码:1-2个字节,包含GB2312、ASCII、BIG5,注意:同一个繁体字在GBK和BIG5中的编码是各不相同的。 GB18030编码:1字节、2字节、4字节,兼容GBKUNICODE是国际统一编码,UCS-2标准:2字节,UCS-4标准:4字节。 UTF-8是对UNICODE的再次编码,UCS-2标准:1-3字节,UCS-4标准:1-6字节。 BIG5编码:2字节,繁体中文,主要在台湾、香港、澳门等地普及,属于业界标准而非官方标准。 比用Api“MultiByteToWideChar、WideCharToMultiByte”的有两个好处 。1,Api的可能造成程序崩溃(相信很多人都遇到过),使用过多个易语言界大佬的编码转换都会出现这个情况,而我这个模块就不会。2,Api的如果大家使用代码页936进行转换,很多GBK字符不受支持,因为代码页936表示的是简体中文(MSDN解释:GB2312,ANSI / OEM简体中文(中国,新加坡);简体中文(GB2312)),GB2312只有几千个字符,相比GBK少了一万多个字符。 所以你不必担心转换的字符会少,我可以负责任的说只会比你用上面两个api支持的字符多,不会少。至于转换速度也并不会慢,我的查表是直接定位位置,没有查找过程,速度不会慢。下一次更新准备添加支持BIG5编码转换。

69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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