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)
输入:abcdefg “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/XP,Linux,Java |
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