`
isiqi
  • 浏览: 16594352 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

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

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

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

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

UCS2 à UTF-8 : UCS2 和 UTF-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<len/2;i++)

{

if((*p==0x00)&&(*(p+1)<0xa0))

{

*q++=*(p+1);

p+=2;

}

else if(*p<0x08)

{

*q++=(char)(0xC0 | (char)(*p<<2) | (char)(*(p+1)>>6));

*q++=(char)(0x80 | *(p+1) & 0x3F);

p+=2;

}else

{

*q++=(char)(0xE0 | (char)(*p>>4));

*q++=(char)(0x80 | (char)((*p & 0x0F)<<2) | (char)(*(p+1)>>6));

*q++=(char)(0x80 | *(p+1) & 0x3F);

p+=2;

}

}

*q='\0';

return utf8;

}

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

  1. 2. UTF-8

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

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

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

{

unsigned long res,i;

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

if(str==0) return 0;

p=str;

res=0;

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

if(q==NULL)

return NULL;

if(q) ucs2=q;

p=str;

for(i=0;i<*len;)

{

if(*p<0xa0)

{

*q++=0x00;

*q++=*p++;

i++;

}

else if(*p<0xe0)

{

*q++=(char)(*p>>2 & 0x07);

*q++=(char)(*p<<6|(*(p+1)&0x3f));

p+=2;

i+=2;

}else

{

*q++=(char)(*p<<4|(char)(*(p+1)>>2)&0x0f);

*q++=(char)(*(p+1)<<6|(*(p+2)&0x3f));

p+=3;

i+=3;

}

}

if(len != NULL)

*len=(unsigned long)(q-ucs2);

return ucs2;

}

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

  1. 3. ASCII

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

分享到:
评论

相关推荐

    gb18030所有字符集与码表.rar

    在"gb18030所有字符集与码表.xls"中,我们可以看到一个详细的码表,这个表格列出了每个字符对应的二进制编码,以及其对应的Unicode值。码表通常包括字符的Unicode编码、GB18030编码、汉字的拼音、部首、笔画数等信息...

    Java中的字符集编码入门(五)Java代码中的字符编码转换Part1.doc

    ### Java中的字符集编码入门(五):Java代码中的字符编码转换Part1 #### 核心知识点概述: 本文档深入探讨了Java编程语言中字符集编码的基础知识,并着重讲解了字符编码转换的基本原理及其在Java代码中的应用。...

    Java中的字符集编码入门(二)编码字符集与字符集编码的区别[参考].pdf

    在Java开发中,处理字符串时,我们需要关注字符集编码问题,特别是在读写文件、网络传输或者数据库操作中。使用不当可能导致乱码问题。Java提供了java.nio.charset包来处理字符编码,例如使用Charset类进行编码和...

    字库与字符集学习资料.rar

    通过学习,我们可以了解如何选择合适的字库以达到最佳的视觉效果,同时也能掌握字符集之间的转换方法,避免在处理多语种文本时遇到问题。 此外,对于编程人员来说,理解字库和字符集的工作原理有助于编写出更高效、...

    行业分类-设备装置-不同移动终端的双字节字符数据备份及转换方法.zip

    标题中的“行业分类-设备装置-不同移动终端的双字节字符数据备份及转换方法”表明这个主题聚焦在IT行业中,特别是与设备装置相关的部分,尤其是涉及到不同移动终端的数据处理。这里的“双字节字符”通常指的是那些用...

    字符编码的转换.pdf

    首先,文件中提到了多种字符编码格式,包括ASCII、DBCS(Double-Byte Character Set,双字节字符集)、MBCS(Multi-Byte Character Set,多字节字符集)和Unicode。ASCII是最早的字符编码标准,使用7位二进制数表示...

    中文短信编码转换工具

    在IT行业中,中文短信编码转换是一项重要的技术,特别是在GSM通信系统中。本文将深入探讨“中文短信编码转换工具”的核心知识点,包括PDU模式、中文编码、Unicode以及短信编码的转换过程。 首先,我们要理解GSM...

    Java WEB开发中的中文乱码问题解决方法.pdf

    中文乱码通常是由于在字符编码转换过程中,字符集不一致或设置不当所导致。为了解决这一问题,首先需要了解Java Web工程字符编码的基本理论,包括字符编码集、编码和解码过程,以及不同编码方式的规则。接下来,将...

    PDU转换工具(SMS)

    这个过程涉及到对短信内容的7位或8位GSM字符集编码,以及将电话号码转化为16进制的MSISDN(国际移动用户识别码)格式。 PDU转换的过程包括以下几个步骤: 1. **字符编码**:短信内容首先需要按照GSM 7位字符集进行...

    WinCE的字符学习资源的PDF版本

    - **解决方案**: 为了兼容ANSI字符串,可以在调用API前显式地进行字符集转换,或者选择使用支持ANSI字符串的替代API。 - **示例代码**: 定义ANSI字符串并在控制台输出。 ```c++ char ansiStr[] = "I am ANSI ...

    移动MAS短信开发Demo(C&C++)

    6. **数据编码**:短信内容通常采用7位ASCII编码,但为了支持更多的字符集,如Unicode,需要使用GSM 7位扩展编码或UCS-2编码。理解这些编码方式并正确转换是必要的。 7. **安全性和隐私**:在处理短信服务时,确保...

    Node.js-filenamify-将一个字符串转换为一个有效的安全的文件名

    1. **非法字符**:不同操作系统对文件名中允许的字符集有不同的限制。例如,Windows系统不允许使用`/`, `\`, `:`, `*`, `?`, `"`, `, `&gt;`, `|`等特殊字符。`filenamify`会自动替换或移除这些非法字符。 2. **路径...

    编码转换工具

    编码转换涉及到计算机科学中的字符集理论、编码标准以及信息处理等方面的知识。理解并掌握这些知识,对于解决与字符编码相关的复杂问题至关重要。通过使用像“编码转换工具”这样的软件,我们可以更轻松地处理这些...

    Unicode和GBK编码转换表

    在实际开发中,例如在网页显示、数据库存储或者文件读写时,我们可能会遇到需要进行编码转换的情况。例如,从GBK编码的文本文件读取内容并显示在Unicode支持的网页上,就需要使用这样的转换表来避免乱码问题。 在...

    WAP_WML页面中文批量转换器

    这个工具对于那些需要处理大量WML页面,特别是处理中文字符集的开发者或网站管理员来说,非常实用。它能够帮助用户节省大量的时间和精力,避免手动逐个文件进行转换的繁琐过程。 在WML页面的开发和维护过程中,可能...

    SmartMemory20190924二维码生成和识别解决中文和特殊字符乱码问题.rar

    本文将深入探讨SmartMemory项目中涉及到的二维码生成和识别技术,特别是如何解决中文和特殊字符可能出现的乱码问题。在现代信息技术中,二维码作为数据交换的重要媒介,其生成与识别的准确性直接影响到数据的正确...

    MFC字符串类.txt

    - **`CString`**:MFC中的基本字符串类,可以自动处理单字节和双字节字符集之间的转换,通常用于存储文本数据。`CString`内部使用`TCHAR`类型来存储字符,这使得它能够在单字节和双字节之间灵活切换。 - **`CT2CA`**...

    WAP编码转换器V1.0.0

    GB2312,全称为《信息交换用汉字编码字符集·基本集》,是中国大陆在1970年代制定的一套汉字编码标准。它包含了6763个常用汉字,主要用于简体中文环境。然而,随着网络的发展和全球化的推进,GB2312的字符范围已无法...

    非主流字体转换器

    3. **文本编码**:不同的文本编码,如ASCII、Unicode、GB2312等,决定了字符集的范围。转换器需要兼容多种编码,以确保所有字符都能正确转换,特别是对于非主流字体中可能包含的特殊或非标准字符。 4. **图形设计**...

    sms_PDUtogbk.rar_GBK_PDU_SMS_delphi 串口_pdu_sms转换网址

    在短信发送中,如果需要发送中文字符,就需要先将GBK编码的字符串转换为PDU编码,因为GSM网络只支持7位的ASCII字符集,而GBK是16位的。转换通常涉及以下几个步骤: 1. 将GBK编码的汉字转换为UCS-2(Unicode的16位...

Global site tag (gtag.js) - Google Analytics