Unicode32和UTF8转换c源码.docxVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
Unicode32和UTF8转换c源码

UCS32和UTF-8之间的C源码转换Sunny.man名词解释Big_Endia和little_Endia如果0x1234在内存BYTE buf[2]里面.buf[0]=0x34,buf[1]=0x12就是little_EnDian.如果buf[0]=0x12,buf[1]=0x34就是big_Endian。如果用BOM(BYTE Order MASK)来标记FE FF就是大端.FF FE就是小端。如果是EF BB BF就是utf-8。在硬盘或是网络中传输时,没有大端小端,因为全是按字节来写或是来传的。当读到内存中时就需要注意了。我所举的例子全是小端模式。也就是说0x594e在我的计算机里代表”奎”这个字。好了不多说现在上源码。unsignedlongGetUTF32Len(unsignedchar *input){unsignedlonglen=1;unsignedchartest=*input;if(test=0xC0) len++;if(test=0xE0) len++;if(test=0xF0) len++;if(test=0xF8) len++;if(test=0xFC) len++;returnlen;}unsignedlongConvertUTF8ToUTF32(unsignedchar * input, int length){constunsignedlongFIRST_BYTE_MARK[7] = { 0x00,0x00, 0xC0, 0xE0, 0xF0, 0xF8, 0xFC };constunsignedlongMASK=0x80;//10 000000unsignedlonglen=GetUTF32Len(input);assert(!(lenlength || len6));unsignedlongtemp=*input++;unsignedlongres=temp^FIRST_BYTE_MARK[len];for(inti=1;ilen;i++) {temp=*input++;res=(res6)+(temp^MASK); }length-=len;returnres;}voidConvertUTF32ToUTF8( unsignedlonginput, char* output, int* length ){constunsignedlongBYTE_MASK = 0xBF;//1011 1111constunsignedlongBYTE_MARK = 0x80;//1000 0000//1100 0000 1110 0000 1111 0000 1111 1000 1111 1100constunsignedlongFIRST_BYTE_MARK[7] = { 0x00, 0x00, 0xC0, 0xE0, 0xF0, 0xF8, 0xFC };if (input 0x80) *length = 1;elseif ( input 0x800 )*length = 2;elseif ( input 0x10000 )*length = 3;elseif ( input 0x200000 )*length = 4;else{ *length = 0; return; }// This code wont covert this correctly anyway.output += *length;// Scary scary fall throughs.switch (*length) {case 4:--output; *output = (char)((input | BYTE_MARK) BYTE_MASK); input = 6;case 3:--output; *output = (char)((input | BYTE_MARK) BYTE_MASK); input = 6;case 2:--output; *output = (char)((input | BYTE_MARK) BYTE_MASK); input = 6;case 1:--output; *output = (char)(input | FIRST_BYTE_MARK[*length]);}}

文档评论(0)

junjun37473 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档