一、编码基础知识
1、ASCII
标准 ASCII(American Standard Code for Information Interchange,美国标准信息交换标准码) 码也叫基础ASCII码,使用 7 位二进制数来表示所有的大写和小写字母,数字 0 到 9、标点符号, 以及在美式英语中使用的特殊控制字符。后128个称为扩展ASCII码,目前许多基于x86的系统都支持使用扩展(或“高”)ASCII。扩展 ASCII 码允许将每个字符的第 8 位用于确定附加的 128 个特殊符号字符、外来语字母和图形符号。
2、 GB2312
GB2312码是中华人民共和国国家汉字信息交换用编码,全称《信息交换用汉字编码字符集——基本集》,由国家标准总局发布,1981年5月1日实施,通行于大陆。新加坡等地也使用此编码。
GB2312的编码范围是0xA1A1-0x7E7E,去掉未定义的区域之后可以理解为实际编码范围是0xA1A1-0xF7FE。
3、BIG-5字符集
BIG5是通行于台湾、香港地区的一个繁体字编码方案。虽然存在一些瑕疵,但广泛应用于电脑行业,尤其是互联网中,从而成为一种事实上的行业标准。
BIG5码是双字节编码方案,其中第一个字节的值在OXAO-OXFE之间,第二个字节在OX40-OX7E和OXA1-OXFE之间
BIG5收录13060个繁体汉字和808个符号
4、GBK 、 GB18030
包含了GB2312编码和BIG-5编码
GBK向下与GB2312 完全兼容,向上支持ISO 10646国际标准,在前者向后者过渡过程中起到的承上启下的作用。GBK 亦采用双字节表示,总体编码范围为8140-FEFE之间,首字节在81-FE之间,尾字节在40-FE之间,剔除XX7F一条线。
Windows 95 简体中文版开始支持GBK代码,但目前的多数搜索引擎都不能很好地支持GBK汉字。
目前windows输入法中输入的字符一般为gbk字符。为了追求个性了,很多非GB2312的gbk字符出现到了用户的输入字符中。
后来国家又发布了 GB18030 标准,扩展了 GBK ,增加了一些 Unicode 里才有的汉字,这样就可以做到和 Unicode 字符集做完全的映射了。
5、unicode
Unicode是一种字符集,与ISO 10646 标准的码表兼容,目的是实现全球所有用字符的都统一编码,
Unicode目前普遍采用的是编码分为2个字节表示的UCS-2(UCS:Universal Character Set)标准,也就是windows系统的wide string,Windows内部处理处理字符串时都采用这个编码方式。另外,还有支持4个字节表示的UCS-4标准.
中、日、韩的三种文字占用了Unicode中0x3000到0x9FFF的部分。
6、utf-8
在 Unix 下使用 UCS-2 (或 UCS-4) 会导致非常严重的问题. 用这些编码的字符串会包含一些特殊的字符, 比如 '/0' 或 '/', 它们在 文件名和其他 C 库函数参数里都有特别的含义. 另外, 大多数使用 ASCII 文件的 UNIX 下的工具, 如果不进行重大修改是无法读取 16 位的字符的. 基于这些原因, 在文件名, 文本文件, 环境变量等地方, UCS-2 不适合作为 Unicode 的外部编码.
UTF-8 转换格式正逐步成为一种占主导地位的交换国际文本信息的方法,因为它可以支持世界上所有的语言,而且它还与 ASCII 兼容。UTF-8 使用变长编码。从 0 到 0x7f(127)的字符把自身编码成单字节,而将值更大的字符编码成 2 到 6 个字节。
0x00000000 - 0x0000007F: 0 xxxxxxx
0x00000080 - 0x000007FF: 110 xxxxx10 xxxxxx
0x00000800 - 0x0000FFFF: 1110 xxxx10 xxxxxx10 xxxxxx
0x00010000 - 0x001FFFFF: 11110 xxx10 xxxxxx10 xxxxxx 10 xxxxxx
0x00200000 - 0x03FFFFFF: 111110 xx10 xxxxxx10 xxxxxx10 xxxxxx 10 xxxxxx
0x04000000 - 0x7FFFFFFF: 1111110 x10 xxxxxx10 xxxxxx10 xxxxxx 10 xxxxxx10 xxxxxx
中文汉字的被编码为3个utf-8字符。
总结:
1、目前windows系统内部采用的是ucs-2编码方式,这种方式会产生大量的内存消耗(大量的ascii字符采用了2个字节表示),但同时由于每个字符固定采用2个字节,性能会比较高,典型的利用存储空间换取性能的方法;
2、目前unicode支持汉字的方案不是太理想,与现有的GBK不兼容,需要进行转换;
3、utf-8编码在处理英文、西欧文字时与非utf编码变化不大,但是处理中文类字符明显问题比较大,一个中文字符在utf-8编码中将占用3个字节,明显不如gbk编码合算。
4、网页上存储的内容如果不是unicode编码,只能显示一种文字,通常需要下载相应的字体包才能支持和正常显示;而unicode编码均可以直接支持,并能在一个网页中显示各种文字,采用unicode进行页面编码是大势所趋。
5、gbk编码的低字节是0x40-0x7E的GBK字符有一定特殊性,因为这些字符占用了ASCII码的位置,这样会给一些系统带来麻烦。特别是“/”,在web系统的c语言自己写的页面转义的时候如果处理不当会引字符被错位或者截断。
二、web系统向Unicode转化
1、页面相关内容
1)页面制作设置charset“<meta http-equiv="Content-Type" c />”
2)在form中,用ajax向服务器post数据的时候,如果服务器只能接受gbk编码,需要进行转码。具体参加参考资料4.
3)资源与表现分离:主要是javascript提示信息相关的内容单独分离出来,
4)通过web编辑工具把页面、模板、xml文件、javascript提示信息进行转码。
2、linux c相关内容
1)提示信息相关的内容不要hardcode到程序中,最好以返回码而非直接提示页面信息,由javascript提示相关返回码对应的信息。
2)可以使用转码工具
3)字符串处理建议使用utf-8形式,这样以前的ascii的字符串类处理函数不需改动,最小的改动量。
4)如果采用utf-8方式,自定义的长度判断、字符串截取、安全相关的转译、函数要改,
5)对于一些特殊处理,也可以调用系统的函数将utf-8的字符转换为ucs-2的字符串,然后按照相关的函数进行处理,参考资料2有相关描述。
3、数据存储
mysql时候数据存储可以保存现有的latin-1(扩展ascii码)的方式不变(推荐),如果是单一编码方式可以指定对应的字符集
4、编码转换相关内容
参考资料9~12是在各种应用场合进行字符转换的一些例子,可以直接使用。
参考资料:
1)UTF-8 and Unicode FAQ(http://www.linuxforum.net/books/UTF-8-Unicode.html)
2)Linux Unicode 编程(http://www.ibm.com/developerworks/cn/linux/i18n/unicode/linuni/index.html)
3)中文字符编码简介 GB2312/GBK/GB18030/BIG5(http://hi.baidu.com/apollosun123/blog/item/17f25034a9c1b64d241f14d8.html)
4)stonehuang同学的“emu的GBK编码”(http://www.blogjava.net/emu/articles/31756.html)
5)常用字符集编码详解:ASCII 、GB2312、GBK、GB18030、unicode、UTF-8 (http://www.21jn.net/html/52/n-552.html)
6)UTF-8 , GBK , GB2312 编码规则与检测(http://www.yueluo.net/PHP/20071016/3308.html)
7)网页编码utf8与gb2312的区别(http://www.eyelon.com/blog/article.asp?id=3)
8)《Windows核心编程》第二章---window下的Unicode编程
9)UTF-8与GB2312之间的互换(windows)(http://www.vckbase.com/document/viewdoc/?id=1397)
10)convert gb2312 to utf-8(linux命令行)(http://blog.chinaunix.net/u1/39867/showart_320100.html)
11)用PHP转换编码 — 将 UTF-8 转换为 GB2312(http://www.jinsongzhang.com/2005/12/09/convert-encoding-from-utf8-gb2312-using-php/)
12)利用iconv函数族进行编码转换--linux(http://www.utf.com.cn/article/s649)
13)unicode及gbk相关资源(http://user.qzone.qq.com/3965743/blog/1201097190)
14)国际化web开发规范(国际产品中心)
15)一种对汉字更环保的 Unicode 编码方案(云风) http://blog.codingnow.com/2008/12/utf-8_replacement.html
1、ASCII
标准 ASCII(American Standard Code for Information Interchange,美国标准信息交换标准码) 码也叫基础ASCII码,使用 7 位二进制数来表示所有的大写和小写字母,数字 0 到 9、标点符号, 以及在美式英语中使用的特殊控制字符。后128个称为扩展ASCII码,目前许多基于x86的系统都支持使用扩展(或“高”)ASCII。扩展 ASCII 码允许将每个字符的第 8 位用于确定附加的 128 个特殊符号字符、外来语字母和图形符号。
2、 GB2312
GB2312码是中华人民共和国国家汉字信息交换用编码,全称《信息交换用汉字编码字符集——基本集》,由国家标准总局发布,1981年5月1日实施,通行于大陆。新加坡等地也使用此编码。
GB2312的编码范围是0xA1A1-0x7E7E,去掉未定义的区域之后可以理解为实际编码范围是0xA1A1-0xF7FE。
3、BIG-5字符集
BIG5是通行于台湾、香港地区的一个繁体字编码方案。虽然存在一些瑕疵,但广泛应用于电脑行业,尤其是互联网中,从而成为一种事实上的行业标准。
BIG5码是双字节编码方案,其中第一个字节的值在OXAO-OXFE之间,第二个字节在OX40-OX7E和OXA1-OXFE之间
BIG5收录13060个繁体汉字和808个符号
4、GBK 、 GB18030
包含了GB2312编码和BIG-5编码
GBK向下与GB2312 完全兼容,向上支持ISO 10646国际标准,在前者向后者过渡过程中起到的承上启下的作用。GBK 亦采用双字节表示,总体编码范围为8140-FEFE之间,首字节在81-FE之间,尾字节在40-FE之间,剔除XX7F一条线。
Windows 95 简体中文版开始支持GBK代码,但目前的多数搜索引擎都不能很好地支持GBK汉字。
目前windows输入法中输入的字符一般为gbk字符。为了追求个性了,很多非GB2312的gbk字符出现到了用户的输入字符中。
后来国家又发布了 GB18030 标准,扩展了 GBK ,增加了一些 Unicode 里才有的汉字,这样就可以做到和 Unicode 字符集做完全的映射了。
5、unicode
Unicode是一种字符集,与ISO 10646 标准的码表兼容,目的是实现全球所有用字符的都统一编码,
Unicode目前普遍采用的是编码分为2个字节表示的UCS-2(UCS:Universal Character Set)标准,也就是windows系统的wide string,Windows内部处理处理字符串时都采用这个编码方式。另外,还有支持4个字节表示的UCS-4标准.
中、日、韩的三种文字占用了Unicode中0x3000到0x9FFF的部分。
6、utf-8
在 Unix 下使用 UCS-2 (或 UCS-4) 会导致非常严重的问题. 用这些编码的字符串会包含一些特殊的字符, 比如 '/0' 或 '/', 它们在 文件名和其他 C 库函数参数里都有特别的含义. 另外, 大多数使用 ASCII 文件的 UNIX 下的工具, 如果不进行重大修改是无法读取 16 位的字符的. 基于这些原因, 在文件名, 文本文件, 环境变量等地方, UCS-2 不适合作为 Unicode 的外部编码.
UTF-8 转换格式正逐步成为一种占主导地位的交换国际文本信息的方法,因为它可以支持世界上所有的语言,而且它还与 ASCII 兼容。UTF-8 使用变长编码。从 0 到 0x7f(127)的字符把自身编码成单字节,而将值更大的字符编码成 2 到 6 个字节。
0x00000000 - 0x0000007F: 0 xxxxxxx
0x00000080 - 0x000007FF: 110 xxxxx10 xxxxxx
0x00000800 - 0x0000FFFF: 1110 xxxx10 xxxxxx10 xxxxxx
0x00010000 - 0x001FFFFF: 11110 xxx10 xxxxxx10 xxxxxx 10 xxxxxx
0x00200000 - 0x03FFFFFF: 111110 xx10 xxxxxx10 xxxxxx10 xxxxxx 10 xxxxxx
0x04000000 - 0x7FFFFFFF: 1111110 x10 xxxxxx10 xxxxxx10 xxxxxx 10 xxxxxx10 xxxxxx
中文汉字的被编码为3个utf-8字符。
总结:
1、目前windows系统内部采用的是ucs-2编码方式,这种方式会产生大量的内存消耗(大量的ascii字符采用了2个字节表示),但同时由于每个字符固定采用2个字节,性能会比较高,典型的利用存储空间换取性能的方法;
2、目前unicode支持汉字的方案不是太理想,与现有的GBK不兼容,需要进行转换;
3、utf-8编码在处理英文、西欧文字时与非utf编码变化不大,但是处理中文类字符明显问题比较大,一个中文字符在utf-8编码中将占用3个字节,明显不如gbk编码合算。
4、网页上存储的内容如果不是unicode编码,只能显示一种文字,通常需要下载相应的字体包才能支持和正常显示;而unicode编码均可以直接支持,并能在一个网页中显示各种文字,采用unicode进行页面编码是大势所趋。
5、gbk编码的低字节是0x40-0x7E的GBK字符有一定特殊性,因为这些字符占用了ASCII码的位置,这样会给一些系统带来麻烦。特别是“/”,在web系统的c语言自己写的页面转义的时候如果处理不当会引字符被错位或者截断。
二、web系统向Unicode转化
1、页面相关内容
1)页面制作设置charset“<meta http-equiv="Content-Type" c />”
2)在form中,用ajax向服务器post数据的时候,如果服务器只能接受gbk编码,需要进行转码。具体参加参考资料4.
3)资源与表现分离:主要是javascript提示信息相关的内容单独分离出来,
4)通过web编辑工具把页面、模板、xml文件、javascript提示信息进行转码。
2、linux c相关内容
1)提示信息相关的内容不要hardcode到程序中,最好以返回码而非直接提示页面信息,由javascript提示相关返回码对应的信息。
2)可以使用转码工具
3)字符串处理建议使用utf-8形式,这样以前的ascii的字符串类处理函数不需改动,最小的改动量。
4)如果采用utf-8方式,自定义的长度判断、字符串截取、安全相关的转译、函数要改,
5)对于一些特殊处理,也可以调用系统的函数将utf-8的字符转换为ucs-2的字符串,然后按照相关的函数进行处理,参考资料2有相关描述。
3、数据存储
mysql时候数据存储可以保存现有的latin-1(扩展ascii码)的方式不变(推荐),如果是单一编码方式可以指定对应的字符集
4、编码转换相关内容
参考资料9~12是在各种应用场合进行字符转换的一些例子,可以直接使用。
参考资料:
1)UTF-8 and Unicode FAQ(http://www.linuxforum.net/books/UTF-8-Unicode.html)
2)Linux Unicode 编程(http://www.ibm.com/developerworks/cn/linux/i18n/unicode/linuni/index.html)
3)中文字符编码简介 GB2312/GBK/GB18030/BIG5(http://hi.baidu.com/apollosun123/blog/item/17f25034a9c1b64d241f14d8.html)
4)stonehuang同学的“emu的GBK编码”(http://www.blogjava.net/emu/articles/31756.html)
5)常用字符集编码详解:ASCII 、GB2312、GBK、GB18030、unicode、UTF-8 (http://www.21jn.net/html/52/n-552.html)
6)UTF-8 , GBK , GB2312 编码规则与检测(http://www.yueluo.net/PHP/20071016/3308.html)
7)网页编码utf8与gb2312的区别(http://www.eyelon.com/blog/article.asp?id=3)
8)《Windows核心编程》第二章---window下的Unicode编程
9)UTF-8与GB2312之间的互换(windows)(http://www.vckbase.com/document/viewdoc/?id=1397)
10)convert gb2312 to utf-8(linux命令行)(http://blog.chinaunix.net/u1/39867/showart_320100.html)
11)用PHP转换编码 — 将 UTF-8 转换为 GB2312(http://www.jinsongzhang.com/2005/12/09/convert-encoding-from-utf8-gb2312-using-php/)
12)利用iconv函数族进行编码转换--linux(http://www.utf.com.cn/article/s649)
13)unicode及gbk相关资源(http://user.qzone.qq.com/3965743/blog/1201097190)
14)国际化web开发规范(国际产品中心)
15)一种对汉字更环保的 Unicode 编码方案(云风) http://blog.codingnow.com/2008/12/utf-8_replacement.html