关于字符集和编码

本文主要介绍字符集和编码的关系,以及在程序开发中编码方式不一致导致的一系列问题。在本文中将给出一个例子来说明由于程序间编码不一致而导致的问题。

  1.   常见字符集和编码
本节将简单介绍一个在软件开发中经常使用的字符集和编码。
ASCII,我们所说的ASCII其实有两层含义,一个是ASCII字符集,一个是ASCII编码方式。因为ASCII码只有唯一的一种编码方式。字符范围为英文字母及一些控制字符,编码方式是用一个字节编码,范围是:0x00-0x7F
ISO 8859,该标准定义了15个字符集,这些字符集是在ASCII字符集的基础上添加了不同拉丁字母而扩展而成的不同字符集,编码方式同ASCII一样也是用一个字节,0x00-0x7F还是用来编ASCII码,剩下的用来编码新扩展的字符。这个标准的15个字符集与编码对应关系为:ISO 8859-x和Latin-x(x 为1-15)
GBK,上面的两个标准的字符集中都没有包括汉字 ,如果要使用汉字就不能使用上面两个标准。GBK标准即定义了字符集,也定义了编码方式。它定义的字符集范围全部中日韩汉字、中文标点符号、ASCII定义的字符。由于ASCII本身已经定义了英文的标点符号,而GBK中又定义了中文的标点符号,这样就导致了在GBK中一种标点符号有两种编码方式(中文和英文),所以在我们在软件开发中会发现中文和英文标点无法通用。这也就是中文输入法中有半角和全角的区别了。GBK的编码方式为两个字节编码,其编码范围从0x8140至0xFEFE(剔除0xxx7F),共23940个码位。

Unicode, 它是国际组织制定的可以容纳世界上所有文字和符号的字符编码方案。Unicode用数字0-0x10FFFF来映射这些字符,最多可以容纳1114112个字符,或者说有1114112个码位。码位就是可以分配给字符的数字。跟以前标准不同的是unicode字符的码位不代表在计算机中的存储位,unicode有很多方式来实现unicode码位,如UTF-8、UTF-16、UTF-32。我们通常说的文件时UTF-8编码,同时也就说明了这个文件使用的Unicode字符集。

2 使用实例


上图是两个客户端与一个服务通信的例子,客户端1的默认编码是GBK编码,客户端2的默认编码为UTF-8,服务器的默认编码也为UTF-8。这个通信的过程是这样的,两个客户端都向服务器发送“本”这个字符串,然后服务器比较两个字符串是否相等。服务器测试的结果是不等。下面我们来详细分析下不相等的原因(所有软件都用C语言编写)。
2.1     客户端1发送“本”的编码

上图是在windows XP下写的代码,这段代码的执行结果为:ffffffb1ffffffbe,因为是char用%x输出,首先会转成int类型,所以把前面的ffffff去掉,那么“本”在该windowXP下的编码为0xb1be。C语言的编码方式采用系统默认的编码方式,我们查看“本”的GBK编码,它确实就是0xb1be,也就是说他使用的是兼容GBK编码的编码方式。这样如果我们没有通过转码直接发给服务器,服务器中存储的来自客户端1的内容为0xb1be
2.2     客户端2发送“本”的编码

上图是在linux下写的代码,这段代码的执行结果为:ffffffe6ffffff9cffffffac,因为是char用%x输出,首先会转成int类型,所以把前面的ffffff去掉,那么“本”在该linux下的编码为0xe69cac。C语言的编码方式采用系统默认的编码方式,查看当前系统的默认编码echo $LANG,显示为UTF-8。计算“本”的UTF-8编码为0xe69cac。如果不进行转码直接发送给服务器,服务器中存储的来自客户端的2的内容为0xe69cac
2.3     服务器比较不相等
服务器比较两个客户端发送过来的0xb1be和0xe69cac,显示为不相等。在这种情况下,我们就需要转码了。假设我们使用UTF-8作为我们的通用编码。那么客户端1在向服务器发送“本”是就需要转化为UTF-8编码的。
3     总结
我们在开发通信程序的过程中,大多会使用到中文,在这种情况下我们就需要了解一些关于字符集和编码的关系。如果不了解这些,一旦在通信软件之间有编码不一致的问题,那么对软件将会出现乱码,有时会导致服务的不可用。本文主要解决了一个呼叫问题过程中因编码不一致而导致无法呼叫问题。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值