Technical Blog Post
Abstract
IBM Java Toolbox for i 实现Java Unicode与IBM i EBCDIC编码转换(上)
Body
字符编码问题是一个老生长谈的话题。对于从事IBM i平台相关工作的人来说,这一点尤为明显。究其原因,是因为IBM i采用的是特有的EBCDIC字符编码。而其他平台如Windows/AIX使用的是以ASCII为中心的字符编码及其扩展编码体系。为兼容各种字符,Java采用的是Unicode字符编码。作为一种面向对象的编程模型,IBM Java Toolbox for i内置有Java Unicode与IBM i EBCDIC之间的字符编码转换功能。本文的目的则是帮助读者如何正确使用IBM Java Toolbox for i提供的相关变换字符编码转换类,实现Java应用程序对IBM i数据与资源的访问,而无需担心字符编码转换问题。有关IBM Java Toolbox for i的基础知识,请参见另一篇技术文档“Toolbox for Java 和 JTOpen”。
从结构上,本文主要分为3部分。第一部分主要介绍编码相关的基础知识,包括ASCII,GB2312,GBK,Unicode,EBCDIC编码。第二部分介绍的是IBM Java Toolbox for i提供了IBM i的EBCDIC编码与Java的Unicode编码之间的编码转换类,包括数值、字符串、日期、数组、结构等类型。最后一部分是总结。
常见的字符编码
在介绍IBM Java Toolbox for i相关的编码转换API之前,我们先来了解一下常见的几种字符编码。
l ASCII(American Standard Code for Information Interchange):最初针对英语设计,共计127个字符。由于拉丁,希腊语等需求。作为ASCII编码的扩展,ISO8859-1的低127个字符与ASCII一样,128-255用作拉丁字符。一共是8位,刚好一个字节。
l GB2312(信息交换用汉字编码字符集——基本集):由于中文字符较多,ASCII以及ISO8859-1无法满足要求。借鉴ISO8859-1的经验,利用双字节来表示汉字。低位的0-127均为ASCII保留,高位用作汉字,共计6768个汉字。
l GBK(信息交换用汉字编码字符集——扩展集):是GB2312的扩展,双字节,能表示21003 个汉字。GB2312通常表示中文简体,而GBK则兼容中文繁体。
l Unicode(Universal Character Set):可变长编码(UTF-8,UTF-16,UTF-32),兼容ASCII码。Unicode编码的设计目标是兼容世界所有的文字与符号。Java采用的编码为Unicode。
l EBCDIC(Extended Binary Coded Decimal Interchange Code):IBM针对早期打孔机式的二进化十进数(BCD, Binary Coded Decimal)排列而成的特有编码。
l CCSID(Coded Character Set Identifier): 相当于ASCII编码体系的代码页(Code Page)。不同的CCSID值对应的不同的字符表。
针对EBCDIC编码体系,CCSID为37表示的是英文字符表,单字节,256个字符(包括英语字母,数字和一些特殊字符),如图1所示。而CCSID为935表示的是简体中文字符集,双字节,因此分视为两个字符表,低字节对应CCSID为836的字符表,高字节对应CCSID为837的字符表。
图1. 使用EBCDIC编码的英语(CCSID=37)字符表
通过与ASCII的对比,我们发现,不同于ASCII编码的字母排列顺序,EBCDIC编码的英文字母不是连续地排列,中间出现多次断续,比如字母从‘a’ 到‘i’对应的编码为0x81至 0x89,而字母从‘j’到‘r’则使用0x91至0x99表示。究其原因,主要与EBCDIC编码针对早期打孔机式的设计思想有关。
为方便读者更好理解EBCDIC编码,我们给出示例, 如图2所示。这里采用CCSID为935的字符编码表,对应的是简体中文字符集。我们需要编码的字符序列为“我来自IBM”,对应的Unicode编码为:
62 11 67 65 81 EA 00 49 00 42 00 4D
通过查询CCSID为935的字符编码表,对应的编码为:
57 D1 50 B3 5C 74 C9 C2 D4
图2. EBCDIC编码举例 从面向对象程序设计的角度,IBM Java Toolbox for i所支持数据转换类的主要目标是实现IBM i数据类型与Java数据类型之间的转换。换句话说,是Unicode与EBCDIC编码之间的转换。 接下来,我们分别从数值、字符串、日期、数组、结构等数据类型的角度,具体介绍如何使用IBM Java Toolbox for i提供的数据转换类,实现Unicode与EBCDIC编码之间的代码互换。与此同时,我们也会演示IBM Java Toolbox for i相关的代码,验证上述字符序列“我来自IBM”与CCSID为935的EBCDIC编码“57 D1 50 B3 5C 74 C9 C2 D4”是否匹配。 作者:皮光明
UID
ibm11145020