IBM Support

IBM Java Toolbox for i 实现Java Unicode与IBM i EBCDIC编码转换(上)

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 UnicodeIBM i EBCDIC之间的字符编码转换功能。本文的目的则是帮助读者如何正确使用IBM Java Toolbox for i提供的相关变换字符编码转换类,实现Java应用程序对IBM i数据与资源的访问,而无需担心字符编码转换问题。有关IBM Java Toolbox for i的基础知识,请参见另一篇技术文档Toolbox for Java JTOpen

从结构上,本文主要分为3部分。第一部分主要介绍编码相关的基础知识,包括ASCIIGB2312GBKUnicodeEBCDIC编码。第二部分介绍的是IBM Java Toolbox for i提供了IBM iEBCDIC编码与JavaUnicode编码之间的编码转换类,包括数值、字符串、日期、数组、结构等类型。最后一部分是总结。

常见的字符编码

在介绍IBM Java Toolbox for i相关的编码转换API之前,我们先来了解一下常见的几种字符编码。

l         ASCIIAmerican 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         UnicodeUniversal Character Set):可变长编码(UTF-8UTF-16UTF-32),兼容ASCII码。Unicode编码的设计目标是兼容世界所有的文字与符号。Java采用的编码为Unicode

l         EBCDICExtended Binary Coded Decimal Interchange Code):IBM针对早期打孔机式的二进化十进数(BCD, Binary Coded Decimal)排列而成的特有编码。

l         CCSIDCoded Character Set Identifier): 相当于ASCII编码体系的代码页(Code Page)。不同的CCSID值对应的不同的字符表。

针对EBCDIC编码体系,CCSID37表示的是英文字符表,单字节,256个字符(包括英语字母,数字和一些特殊字符),如图1所示。而CCSID935表示的是简体中文字符集,双字节,因此分视为两个字符表,低字节对应CCSID836的字符表,高字节对应CCSID837的字符表。

1. 使用EBCDIC编码的英语(CCSID=37)字符表

图像   

通过与ASCII的对比,我们发现,不同于ASCII编码的字母排列顺序,EBCDIC编码的英文字母不是连续地排列,中间出现多次断续,比如字母从‘a’ ‘i’对应的编码为0x81 0x89,而字母从‘j’到‘r’则使用0x910x99表示。究其原因,主要与EBCDIC编码针对早期打孔机式的设计思想有关。

为方便读者更好理解EBCDIC编码,我们给出示例, 如图2所示。这里采用CCSID935的字符编码表,对应的是简体中文字符集。我们需要编码的字符序列为“我来自IBM”,对应的Unicode编码为:

62 11 67 65 81 EA 00 49 00 42 00 4D

通过查询CCSID935的字符编码表,对应的编码为:

57 D1 50 B3 5C 74 C9 C2 D4

2. EBCDIC编码举例

图像  从面向对象程序设计的角度,IBM Java Toolbox for i所支持数据转换类的主要目标是实现IBM i数据类型与Java数据类型之间的转换。换句话说,是UnicodeEBCDIC编码之间的转换。

接下来,我们分别从数值、字符串、日期、数组、结构等数据类型的角度,具体介绍如何使用IBM Java Toolbox for i提供的数据转换类,实现UnicodeEBCDIC编码之间的代码互换。与此同时,我们也会演示IBM Java Toolbox for i相关的代码,验证上述字符序列“我来自IBM”与CCSID935EBCDIC编码“57 D1 50 B3 5C 74 C9 C2 D4”是否匹配。

 

作者:皮光明

[{"Business Unit":{"code":"BU058","label":"IBM Infrastructure w\/TPS"},"Product":{"code":"SWG60","label":"IBM i"},"Component":"","Platform":[{"code":"PF025","label":"Platform Independent"}],"Version":"","Edition":"","Line of Business":{"code":"LOB57","label":"Power"}}]

UID

ibm11145020