热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

移动开发中的字符集转换问题

移动开发中的字符集转换问题在手机开发中会碰到关于字符类型的转换问题,特别是如果想在程序中支持中文则必须搞清楚某些字符集的表示方法,较常见的是UCS2、UTF-8、ASCII

移动开发中的字符集转换问题

在手机开发中会碰到关于字符类型的转换问题,特别是如果想在程序中支持中文则必须搞清楚某些字符集的表示方法,较常见的是UCS2UTF-8ASCII字符集,对于GB2312码则较少平台支持,所以往往要做的转换是把GB2312码转换成UCS2UTF-8码。

1.UCS2

UCS2码是用两个字节表示一个字符,如果字符是ASCII码中的字符,则一个字节为空(值为0),另一个字节为原ASCII码的值。UCS2字符中的两个字节有个字节顺序的问题,不同平台中两个字节的顺序也许是相反的,所以在把UCS2字符转换成其它字符时,要先弄清楚字节顺序,否则转换出来的字符很有可能是乱码。

UCS2àASCII:要把UCS2转换成ASCII码,只要把其中为0的字节去掉就可以了。

UCS2àUTF-8:UCS2UTF-8字符有一定的必然关系,所以转换有一个固定的方法,实现方法如下面的代码所示:(windows CE中可以调用WideCharToMultiByte来实现,其中第一个参数设为CP_UTF8)

char * UCS2toUTF8(char *str,unsigned long len)

{

 unsigned long res,i;

 char *p,*q,*utf8 = NULL;

 

 if(str==0) return 0;

 p=str;

 res=0;

 q=(char*)malloc(len*3+1);

 if(q==NULL)

         return NULL;

 if(q)

    utf8=q;

 

 p=str;

 for(i=0;i

{

         if((*p&#61;&#61;0x00)&&(*(p&#43;1)<0xa0))

         {

                *q&#43;&#43;&#61;*(p&#43;1);

                p&#43;&#61;2;

         }

         else if(*p<0x08)

         {

                *q&#43;&#43;&#61;(char)(0xC0 | (char)(*p<<2) | (char)(*(p&#43;1)>>6));

                *q&#43;&#43;&#61;(char)(0x80 | *(p&#43;1) & 0x3F);

                p&#43;&#61;2;

         }else

         {

                *q&#43;&#43;&#61;(char)(0xE0 | (char)(*p>>4));

                *q&#43;&#43;&#61;(char)(0x80 | (char)((*p & 0x0F)<<2) | (char)(*(p&#43;1)>>6));

                *q&#43;&#43;&#61;(char)(0x80 | *(p&#43;1) & 0x3F);

                p&#43;&#61;2;

         }

 }

 *q&#61;&#39;/0&#39;;

 return utf8;

}

UCS2àGB2312:要把UCS2字符转换成GB2312字符并不是一件容易的事&#xff0c;因为二者之间没有固定的对应关系&#xff0c;必须根据映射表来进行转换&#xff0c;所以系统平台如果没有提供转换方法而要自己去实现则是件很麻烦的事&#xff1a;你要自己建立一张映射表&#xff0c;然后实现在映射表中查找。在windows CE中可以调用WideCharToMultiByte函数来实现(其中第一个参数值必须是936)

2&#xff0e;UTF-8

UTF-8字符由一个以上的字节组成&#xff0c;其中可以根据第一个字节来判断该字符的长度&#xff1a;第一个字节中高位连续几个值为1的个数即表示该字符有多少个字节&#xff0c;如果是由两个以上的字节组成&#xff0c;则第二个字节以后的所有字节高两位都是“10”。ASCII码和UTF-8字符表示形式是一样的&#xff0c;所以二者之间可以不用进行特殊转换。UTF-8字符的一个优势是没有字节顺序&#xff0c;不象UCS2有字节顺序之分&#xff0c;所以很多平台采用了UTF-8字符来表示&#xff0c;其实UTF-8在网络通信中是最常用的。

UTF-8àUCS2&#xff1a;只要把UTF-8字符中表示字节个数的1和紧随其后的0去掉&#xff0c;以及后面字节头两位的“10”去掉&#xff0c;最后重新合并剩下的位&#xff0c;组合起来就是UCS2字符了&#xff0c;当然&#xff0c;如果UTF-8字符是ASCII码&#xff0c;则处理方法是不一样的&#xff1a;要加个空字节。处理方法如下面的代码&#xff1a;(windows CE中可以调用MultiByteToWideChar来实现&#xff0c;其中第一个参数设为CP_UTF8)

char * UTF8toUCS2(char *str,unsigned long *len)

 {

 unsigned long res,i;

 char *p,*q,*ucs2 &#61; NULL;

 

 if(str&#61;&#61;0) return 0;

 p&#61;str;

 res&#61;0;

 q&#61;(char*)malloc(*len*2&#43;1);

 if(q&#61;&#61;NULL)

         return NULL;

 if(q) ucs2&#61;q;

 

         p&#61;str;

 for(i&#61;0;i<*len;)

 {

         if(*p<0xa0)

         {

                *q&#43;&#43;&#61;0x00;

                *q&#43;&#43;&#61;*p&#43;&#43;;

                i&#43;&#43;;

        }

       else if(*p<0xe0)

        {

                *q&#43;&#43;&#61;(char)(*p>>2 & 0x07);

                *q&#43;&#43;&#61;(char)(*p<<6|(*(p&#43;1)&0x3f));

                p&#43;&#61;2;

                i&#43;&#61;2;

        }else

        {

           *q&#43;&#43;&#61;(char)(*p<<4|(char)(*(p&#43;1)>>2)&0x0f);

           *q&#43;&#43;&#61;(char)(*(p&#43;1)<<6|(*(p&#43;2)&0x3f));

           p&#43;&#61;3;

           i&#43;&#61;3;

        }

}

if(len !&#61; NULL)

        *len&#61;(unsigned long)(q-ucs2);

return ucs2;

}

UTF-8àGB2312&#xff1a;同UCS2一样&#xff0c;没有直接的对应关系&#xff0c;大部分平台没有提供二者之间的直接转换方法&#xff0c;必须先把UTF-8转换成UCS2字符&#xff0c;然后再把UCS2字符转换成GB2312字符&#xff0c;反过来要把GB2312字符转换成UTF-8字符&#xff0c;也是要先转换成UCS2字符。

3&#xff0e;ASCII

这个是在程序中最常用的也是最简单的字符&#xff0c;判断一个字符是否是ASCII码方法非常简单&#xff1a;只要看字节中最高位值是否为0&#xff0c;若为0则是ASCII码。ASCII码跟UCS2UTF-8之间的转换方法可以看上面关于UCS2UTF-8的描述。


推荐阅读
  • 转自:http:www.phpweblog.netfuyongjiearchive200903116374.html一直对字符的各种编码方式懵懵懂懂,什 ... [详细]
  • C++字符字符串处理及字符集编码方案
    本文介绍了C++中字符字符串处理的问题,并详细解释了字符集编码方案,包括UNICODE、Windows apps采用的UTF-16编码、ASCII、SBCS和DBCS编码方案。同时说明了ANSI C标准和Windows中的字符/字符串数据类型实现。文章还提到了在编译时需要定义UNICODE宏以支持unicode编码,否则将使用windows code page编译。最后,给出了相关的头文件和数据类型定义。 ... [详细]
  • 本文介绍了C#中生成随机数的三种方法,并分析了其中存在的问题。首先介绍了使用Random类生成随机数的默认方法,但在高并发情况下可能会出现重复的情况。接着通过循环生成了一系列随机数,进一步突显了这个问题。文章指出,随机数生成在任何编程语言中都是必备的功能,但Random类生成的随机数并不可靠。最后,提出了需要寻找其他可靠的随机数生成方法的建议。 ... [详细]
  • CF:3D City Model(小思维)问题解析和代码实现
    本文通过解析CF:3D City Model问题,介绍了问题的背景和要求,并给出了相应的代码实现。该问题涉及到在一个矩形的网格上建造城市的情景,每个网格单元可以作为建筑的基础,建筑由多个立方体叠加而成。文章详细讲解了问题的解决思路,并给出了相应的代码实现供读者参考。 ... [详细]
  • PHPMailer邮件类邮件发送功能的使用教学及注意事项
    本文介绍了使用国外开源码PHPMailer邮件类实现邮件发送功能的简单教学,同时提供了一些注意事项。文章涵盖了字符集设置、发送HTML格式邮件、群发邮件以及避免类的重定义等方面的内容。此外,还提供了一些与PHP相关的资源和服务,如传奇手游游戏源码下载、vscode字体调整、数据恢复、Ubuntu实验环境搭建、北京爬虫市场、进阶PHP和SEO人员需注意的内容。 ... [详细]
  • 本文介绍了南邮ctf-web的writeup,包括签到题和md5 collision。在CTF比赛和渗透测试中,可以通过查看源代码、代码注释、页面隐藏元素、超链接和HTTP响应头部来寻找flag或提示信息。利用PHP弱类型,可以发现md5('QNKCDZO')='0e830400451993494058024219903391'和md5('240610708')='0e462097431906509019562988736854'。 ... [详细]
  • Windows7 64位系统安装PLSQL Developer的步骤和注意事项
    本文介绍了在Windows7 64位系统上安装PLSQL Developer的步骤和注意事项。首先下载并安装PLSQL Developer,注意不要安装在默认目录下。然后下载Windows 32位的oracle instant client,并解压到指定路径。最后,按照自己的喜好对解压后的文件进行命名和压缩。 ... [详细]
  • 基于dlib的人脸68特征点提取(眨眼张嘴检测)python版本
    文章目录引言开发环境和库流程设计张嘴和闭眼的检测引言(1)利用Dlib官方训练好的模型“shape_predictor_68_face_landmarks.dat”进行68个点标定 ... [详细]
  • 在Oracle11g以前版本中的的DataGuard物理备用数据库,可以以只读的方式打开数据库,但此时MediaRecovery利用日志进行数据同步的过 ... [详细]
  • 使用C++编写程序实现增加或删除桌面的右键列表项
    本文介绍了使用C++编写程序实现增加或删除桌面的右键列表项的方法。首先通过操作注册表来实现增加或删除右键列表项的目的,然后使用管理注册表的函数来编写程序。文章详细介绍了使用的五种函数:RegCreateKey、RegSetValueEx、RegOpenKeyEx、RegDeleteKey和RegCloseKey,并给出了增加一项的函数写法。通过本文的方法,可以方便地自定义桌面的右键列表项。 ... [详细]
  • Non-ASCIIhelponitsownisOK: ... [详细]
  • 请教大家一个javaweb方面的问题·········
    问题问题是这样的,jsp页面统一采用的是GBK的编码格式。web服务器使用的是JBOSS。在如下查询页面中输入中文的查询条件:在点击下一页的时候,要求查询条件也进行回显。但是会出现 ... [详细]
  • c语言 怎么访问64位地址_C语言调动硬件的原理是什么?
    大家都知道我们可以使用C语言写一段程序来控制硬件工作,但你知道其工作原理吗?1c语言在实际运行中,都是以汇编指令的方式运行的,由编译器把C ... [详细]
  • LINUX运行谷歌TTS,中文TTS 的简单实现(基于linux)之 语音库的实现
    语音库保存着常用汉字的发音(多音的汉字只记录其一种发音,这也是本系统的一个缺陷,需要以后完善),所以先要得到一汉字集,这个汉 ... [详细]
  • 像c语言中的goto,shell中的break后面跟跳出层次的在方法在python中都没有,这可不是因为python设计的low,而是允许一次性跳出多个循环很容易造成程序流程的混乱 ... [详细]
author-avatar
不要再想Ta
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有