UNICODE 编码中文字符长度

上一篇 / 下一篇  2009-11-03 21:36:50 / 个人分类:FUNCTION TEST

Unfortunately,I was challenged by my boss today.he asked me whether I run test casefor spec feature and whether I know about the Chinese charater need 3 bits in our iCommon plat.but as far I know It only take up 2 bits.There are two text fields,both they have length limited.they are 20 and 2000 respectively.On condition of English language,I verified English and Chinese character for the former one.So I told him what he said is incorrect.but I found It is ture when I run test case in Chinese enviroment.

今天很不幸,被我们老大challenge了。他问Wo是否跑完了所有的CASE,是否知道在系统中中文字符占用3个字节。就我所知道的情况,中文字符只暂用两个字节,DEV也如是这样说。于是对他的两个问题都做了肯定的回复。情况是这样的,两个文本框长度限制分别为20和2000位。在English语言下,英文字母和中文字符分别验证通过,但是我只是验证了前者。至于后者我check了源代码逻辑一样,就同理可得pass!呵呵,就是由于2000太长太不“容易”verify,于是就怀疑到CASE的执行情况.于是就发生了前面所述情况。然而最终在Chinese语言下验证了他说的内容,中文字符占用3个字节。于是我在网络上查阅和摘抄了字符编码相关的内容。

后记:为了弥补工作的过失,花了四个小时的时间来研究该问题,以为会得到完美的解决方案。与DEV交流后,他们认可了在UTF-8编码下汉字实际占用3个字节,于是提出以字符数的长度来作为判断的条件,而不以字节数为单位度量长度。这样保持了中文和英语的兼容性,(譬如,某个字段最大长度为6。在输入多余6个字母即有有好提示“XXXXmore than 6!”,但是输入多于2个汉字的情况下也出现同样的信息)

编码格式UTF-8:  字段A(最大长度6)

输入:abcdef    “XXXXmore than 6!”

输入:上海滩       “XXXXmore than 6!”

至于其他语言的国际化由项目来自行处理。但是此方案又涉及到对DB所有表结构的更改,原来可以6个字节的字段为了兼容中文必须设置为6*3=18位。于是我们得出了结论!设计问题,历史原因,代价太大!这个问题就继续“折腾”吧!

GB2312,UTF-8,UTF-16,UTF-32比较

在GB2312编码中一个汉字占2个字节,而在UTF-8中,一个汉字要占3个字节”。“UTF-8编码(其实是一种Unicode编码) 或Unicode编码 本身就支持了,简体字.  繁体字, 英文,俄文,日文,韩文...等等..”
网站用UTF-8显然多占了一半的空间,但是这样就应该能够保证在不同语言版本的系统中不会变成乱码吧。

UTF-8下面,貌似汉字都是3字节的。UTF-32下,会是4字节.
编码是一个将一组 Unicode 字符转换为一个字节序列的过程。解码是一个反向操作过程,即将一个编码字节序列转换为一组 Unicode 字符。Unicode 标准为所有支持脚本中的每个字符分配一个码位(一个数字)。Unicode 转换格式 (UTF) 是一种码位编码方式。Unicode 标准 3.2 版使用下列 UTF: 
UTF-8,它将每个码位表示为一个由 1 至 4 个字节组成的序列。
UTF-16,它将每个码位表示为一个由 1 至 2 个 16 位整数组成的序列。
UTF-32,它将每个码位表示为一个 32 位整数。

1.编码问题的由来,相关概念的理解

1.1字符与编码的发展

从计算机对多国语言的支持角度看,大致可以分为三个阶段:

 

系统内码

说明

系统

阶段一

ASCII

计算机刚开始只支持英语,其它语言不能够在计算机上存储和显示。

英文DOS

阶段二

ANSI编码

 

 

为使计算机支持更多语言,通常使用0x80~0xFF范围的2个字节来表示1个字符。比如:汉字''在中文操作系统中,使用[0xD6,0xD0]这两个字节存储

中文DOS,中文Windows 95/98,日文Windows 95/98

不同的国家和地区制定了不同的标准,由此产生了GB2312, BIG5, JIS等各自的编码标准。这些使用2个字节来代表一个字符的各种汉字延伸编码方式,称为ANSI编码。在简体中文系统下,ANSI编码代表GB2312编码,在日文操作系统下,ANSI编码代表JIS编码。

不同ANSI编码之间互不兼容,当信息在国际间交流时,无法将属于两种语言的文字,存储在同一段ANSI编码的文本中。

阶段三

UNICODE

为了使国际间信息交流更加方便,国际组织制定了UNICODE字符集,为各种语言中的每一个字符设定了统一并且唯一的数字编号,以满足跨语言、跨平台进行文本转换、处理的要求。

Windows NT/2000/XPLinuxJava

2字符,字节,字符串
理解编码的关键,是要把字符的概念和字节的概念理解准确。这两个概念容易混淆,我们在此做一下区分:

 

概念描述

举例

字符

人们使用的记号,抽象意义上的一个符号。

'1', '', 'a', '$', '', ……

字节

计算机中存储数据的单元,一个8位的二进制数,是一个很具体的存储空间。

0x01, 0x45, 0xFA, ……

ANSI

字符串

在内存中,如果字符是以ANSI编码形式存在的,一个字符可能使用一个字节或多个字节来表示,那么我们称这种字符串为ANSI字符串或者多字节字符串

"中文123"

(占7字节)

UNICODE

字符串

在内存中,如果字符是以在UNICODE中的序号存在的,那么我们称这种字符串为UNICODE字符串或者宽字节字符串

L"中文123"

(占10字节)

参考连接:

http://www.regexlab.com/zh/encoding.htm

http://www.javaeye.com/topic/351135

http://www.cnblogs.com/shinings/archive/2009/09/19/1570197.html

http://baike.baidu.com/view/40801.htm

 



TAG:

 

评分:0

我来说两句

Open Toolbar