本用户手册描述 OpenVMS/Hanzi 软件的基本概念、特性及命令。
机密计算机软件。必须有 HP 授予的有效许可证,方可拥有、使用或复制本软件。根据供应商的标准商业许可证的规定,美国政府应遵守 FAR 12.211 和 12.212中有关“商业计算机软件”、“计算机软件文档”与“商业货物技术数据”条款的规定。
本文档中的信息如有更改,恕不另行通知。随 HP 产品及服务提供的明示性担保声明中列出了适用于此 HP 产品及服务的专用担保条款。本文中的任何内容均不构成额外的担保。HP 对本文中的技术或编辑错误以及缺漏不负任何责任。
Intel 和 Itanium 是 Intel Corporation 及其子公司在美国及其他国家或地区的商标或注册商标。
4.2.3 APPEND、BACKUP、CONVERT、COPY、CREATE 和TYPE 中
使用汉字 4-2
4.2.4 ASSIGN、DEASSIGN 和 DEFINE 中使用汉字 4-2
7.7 可调用SORT 和 MERGE 例行程序中的汉字支持 7-6
OpenVMS/Hanzi 在现有的 OpenVMS 软件特性上添加汉字字符处理能力。现在,用户可在各种 OpenVMS/Hanzi 功能下处理 ASCII 及 DEC 汉字码。
OpenVMS/Hanzi 支持以双字节八字位格式表示的中文数据,符合中华人民共和国国家标准信息交换用汉字编码字符基本集(GB-2312-80)。有关 DEC 汉字字符集的详情,请参阅本手册第 2 章。
在 OpenVMS/Hanzi 上, 大部分的 OpenVMS DCL命令都支持汉字字符。有关这些命令的详细介绍,请参阅第 3, 4, 6, 7, 8, 9,10,11 和 12 章。用户也可于多种编程语言写成的程序使用汉字。附录 A 列有多种样本程序供参考。
OpenVMS/Hanzi 提供了许多能够处理汉字字符的公用程序, 例如:
DEC 汉字字符集是包含汉字和非汉字字符的基本字符集, 与 GB-2312-801 兼容。
DEC 汉字字符集分为两部分 -- DEC GB-2312字符集和扩充 GB 字符集, 共有 7,445 个字符及 8,836个字符位。
扩充 GB 字符集是一个扩充区域, 有 8,836 个字符位供用户定义自己的字形,供以后扩充字符集之用。
表 2-1 和 2-2 列出 DEC 汉字字符集内各区域的定义。
DEC 汉字码用双字节表示一个图形字符。为区别汉字码和一般的 ASCII 码, 一个字符的第一字节的最高有效位总是设置为 1,而第二字节的最高有效位则可以是 1 (即字符属于 DEC GB-2312 字符集)或 0(即字符属于扩充 GB 字符集)。
图 2-2 展示一个汉字在 DEC GB-2312 字符集及扩充 GB 字符集中的表示方法。
DEC 汉字码符合 GB-2312-80 标准。DEC GB-2312 字符集和扩充 GB 字符集的代码表都划分为 94 个区(节), 编号自 1 至 94。每个区又分为 94 个位,编号也自 1 至 94。
DEC 汉字码的第一字节决定该码的区号,而第二字节则决定该码的位号。此外,第二字节的最高有效位决定该码是属于 DEC GB-2312字符集还是扩充 GB 字符集。
下面两个例子说明在 DEC GB-2312 字符集及扩充 GB 字符集中一个汉字字符的双字节汉字码和区位号的相互关系。通常,区号及位号是十进制的,而双字节汉字码则以十六进制表示。
区号 (十进制) = 第一字节 (十六进制) - A0 (十六进制) 和
位号 (十进制) = 第二字节 (十六进制) - A0 (十六进制)
区号 (十进制) = 第一字节 (十六进制) — A0 (十六进制) 和
OpenVMS/Hanzi 支持下列汉字字符的终端输入和输出特性:
OpenVMS/Hanzi 可支持所有由 OpenVMS 支持的行编辑功能,诸如光标移动、删除、插入、重键以及行绕回。有关完整的支持特性,请参阅 OpenVMS 文献。
终端屏幕上显示的汉字字符占据的位置多于一列。因此, OpenVMS/Hanzi 提供两种操作态进行编辑:
在此态中,在汉字终端上删除键一次删除一列。光标移动键一次移过一列。
在此态中,删除键一次删除一个字符。光标移动键一次移过一个汉字字符。而删除字键 (CTRL/J) 可删除一个英文字或一串汉字字符。
如果输入行没有完全填满和输入字符太宽无法显示(例如, 行末尾只有一个显示单元 空着,而该输入是一个汉字字符)则这个输入的汉字会被暂存起来为下一次读入要求的数据输入。
HANZIGEN 公用程序用来在这两种编辑态之间进行转换。有关转换态的命令, 请参阅第 5 章《HANZIGEN 公用程序》。
应用程序可指定一个用标记分成一个以上的输入区的输入字段。如果 DEC GB-2312 字符集中的汉字字符处于标记定义的界上 (也就是说, 它必须分成两半以 插入不同的区域),它就被视为无效字符。
OpenVMS/Hanzi 可为用户提供 CMGR 公用程序 (请参阅第 6 章《字符管理程序 (CMGR) 公用程序》)建立用户定义字符 (UDC)。这些字符可以用来补充由 OpenVMS/Hanzi 支持的汉字标准定义字符。
为了要在终端或打印机上显示这些字符, OpenVMS/Hanzi支持用于终端输入输出的按需装入 (ODL) 协议。支持 ODL 协议的终端和打印机可自动卸下 UDC 字形数据来显示 UDC。
LAT/Master 是在 LAT 环境中支持 ODL 所需要的软件,它包括 OpenVMS/Hanzi 上运行的软件和终端服务器上运行的软件。
为了使 ODL 在 LAT 网络上操作, 必须把以下版本的DECserver 软件下行装入对应的服务器单元:
要利用 LAT 能力, 须确保所有装入主机安装了正确的DECserver 软件版本以及该系统运行 OpenVMS。
要了解如何在装入主机上安装 DECserver 软件和把服务器映象下行装入服务器, 请参阅随 DECserver 提供的有关文献。
ODL 机制要求系统设置伪设备 FHA0: 和 FONT_HANDLER。
SYSGEN> CONNECT FHA0: /NOADAPTER /MAXUNIT=1
/PROCESS_NAME="FONT_HANDLER" -
OpenVMS/Hanzi 上的 SYSGEN 命令为字形数据下行装入而装入一个伪设备驱动器并建立一个伪设备 FHA0:。RUN 命令建立一个系统进程 FONT_HANDLER 为终端及打印机的按需装入请求服务。
注意, 这些命令已编辑在 OpenVMS/Hanzi 系统启动命令过 SYS$STARTUP:HSY$STARTUP.COM 中, 因此正常情况下, OpenVMS/Hanzi 系统对 ODL 配置是正确的。
如果设备与终端服务器相连接,则必须恰当地配置终端服务器端口。
对于直接连接或与一个终端服务器相连接的设备,系统中的每个终端端口必须对 ODL进行个别配置。通常,终端端口对 ODL 的默认值为撤销 ODL。HANZIGEN 公用程序用来对个别终端 (参阅用 HANZIGEN 设置终端端口一节) 允许 ODL。终端或打印机也要求设置,以便允许终端或打印机的 ODL 能力。
DECserver 软件中, 为 ODL 支持引入新端口特征 ON-DEMAND [LOADING]。这就使得用户可在每个与汉字终端或汉字打印机相连接的服务器端允许或撤销 ODL 能力。要对一个具体端口允许或撤销 ODL, 则在 Local 态发出下列命令:
Local> {SET|DEFINE} PORT [n] ON-DEMAND [LOADING]
例如, 要对端口 3 永久地允许 ODL 能力(即把这些设置存储到永久数据库中), 则发出:
Local> DEFINE PORT 3 ON-DEMAND LOADING ENABLED
要校验是否已允许 ON-DEMAND [LOADING] 特征, 则在 Local 态发出 LIST PORT CHARACTERISTICS 命令:
Local> LIST PORT CHARACTERISTICS
Character Size: 8 Input Speed: 9600
Flow Control: XON Output Speed: 9600
Parity: None Modem Control: Disabled
Access: Local Local Switch: None
Forwards Switch: None Type: Soft
Autobaud, Autoprompt, Broadcast, Input Flow
Control, Loss Notification,Massage Codes, Output
在 OpenVMS/Hanzi 中, 使用 HANZIGEN 在终端端口上允许 ODL。有关使用 HANZIGEN 命令来允许和撤销 ODL 的详情, 请参阅第 5 章《HANZIGEN 公用程序》一章。限定词 "/FONT" 和 "/NOFONT" 在 HANZIGEN 中用来允许或撤销按需装入。按照默认是撤销按需装入。下列命令将对当前终端
按 <F3> 键以进入 "设置目录",然后选择 "终端" 设置并且在 "终端设置" 项目单内允许 ODL。
在上一个对话期中列出的汉字打印机上允许 ODL, 需要进行下列步骤:
本章列出汉字终端及汉字打印机所需的设备特征,并叙述在 DCL 命令及公用程序中如何应用汉字字符。
与 OpenVMS 求助信息相似, 用户可以应用 HANZIGEN 公用程序来选择英文或汉字信息, 唯 SHOW LOGICAL 及 SHOW TRANSLATION 例外。
用户可在文件中使用汉字数据, 并可在APPEND、BACKUP、CONVERT、COPY、CREATE 和 TYPE命令中包括汉字。例如:
您可在逻辑名及其等效字符串中使用汉字, 也可于 ASSIGN、DEASSIGN、DEFINE 命令中使用汉字。
您可用 SHOW LOGICAL 和 SHOW TRANSLATION 命令显示由 ASSIGN 和 DEFINE 以汉字字符定义的逻辑名, 而词法功能 F$LOGICAL 则可转换汉字。例如:
您可使用 HELP 命令和 HANZIGEN 公用程序来调用 OpenVMS HELP 设施, 以汉字或英文显示有关 OpenVMS 命令或题目的资料。
注意, 您可使用下列命令直接显示英文求助 (即使您的输出设备设置成 HANZI_MSG):
$ REPLY/TERMINAL=TT "REPLY 中混合汉字使用"
通用 PostScript 打印子系统 (WWPPS) 提供对 Alpha 和 I64 平台上纯文本文件的高质量打印。它能够同时打印包含单字节和多字节亚洲字符的纯文本文件。
$ WWPPS := = $SYS$SYSTEM:WWPPS
WWPPS>PRINT/QUEUE=hp$printer/LOCALE=zh_cn_dechanzi hanzi-text_file.txt
$ WWPPS PRINT/QUEUE=hp$printer/LOCALE=zh_cn_dechanzi hanzi-text_file.txt
HANZIGEN 公用程序设置及展示汉字终端类型、允许及撤销汉字终端及打印机的按需装入。
HANZIGEN 的 SET 和 SHOW 命令与 DCL 的相似, 但 HANZIGEN 的SET 和 SHOW 命令操纵与汉字终端有关的属性。
SET 命令设置汉字终端类型及允许按需装入。汉字终端类型可以是VT82、VT382、LA84、 LA86、LA88、LA280 或 LA380。要设置汉字终端为 ASCII 特征, 您可指定 VT100 或 VT300_series为设备类型。对于提供英文和汉字求助/出错信息的公用程序,您可使用 SET 命令通过 /OUTPUT任选项选择输出语言。
SET [设备名[ : ]] [/DEVICE_TYPE= 设备类型]
SHOW 命令展示汉字终端及打印机特征,显示格式是每种设备占一行,并且具如下字段:
的设备类型将展示为 HANZI_VDU, 而 LA84-C、LA86-C、LA88-C、LA280-CB 和 LA380-CB的设备类型则为 HANZI_PRT。
但是, 在 DCL SHOW 命令上, 已由 HANZIGEN 设置为VT82 或VT382 终端的设备名是 VT80 或 VT300, 而由 HANZIGEN 设置为 LA84、LA86、LA88、LA280 或 LA380 终端的设备名则是 LA84。
Device Name Type On Demand Input Output
_RTA2: HANZI_VDU DISABLE ASCII HANZI_MSG
Device Name Type On Demand Input Output
_OPA0: LA36 DISABLE ASCII Unknown
_RTA1: VT300_Series DISABLE HANZI Unknown
_RTA2: HANZI_VDU DISABLE ASCII HANZI_MSG
_LTA5006: VT200_Series DISABLE HANZI Unknown
_LTA5007: HANZI_VDU DISABLE ASCII Unknown
_LTA5008: HANZI_VDU DISABLE ASCII Unknown
Device name Type On Demand Input Output
_TTA0: VT200_series DISABLE ASCII ASCII_MSG
HANZIGEN> SET /DEVICE_TYPE=VT382
Device name Type On Demand Input Output
_TTA0: HANZI_VDU DISABLE HANZI HANZI_MSG
HANZIGEN> SET TXA1: /DEVICE_TYPE=LA380 /PERMANENT /FONT
Device name Type On Demand Input Output
_TXA1: HANZI_PTR ENABLE HANZI Unknown
Device name Type On Demand Input Output
_TAX2: HANZI_VDU DISABLE HANZI Unknown
HANZIGEN> SET TXA2: /DEVICE_TYPE=VT100 /PERMANENT
本章描述 OpenVMS/Hanzi SORT 和 MERGE 公用程序中提供的汉字处理能力。
OpenVMS/Hanzi 的 SORT 和 MERGE公用程序根据用户所指定的关键字来排列输入文件记录,然后产生一个已排序的输出文件。SORT 和 MERGE可按照下列整理序列来排列汉字数据记录:
input-file-specification[qualifiers] -
_$ output-file-specification[qualifiers]
input-file-specifications[qualifiers] -
_$ output-file-specification[qualifiers]
在合并前, MERGE命令里的输入文件必须先以同一种整理序列及同一种次序(升序或降序) 预先排序。MERGE命令所指定的排序次序及整理序列必须与输入文件的相同。
/KEY 限定词定义 SORT 的关键字,在一命令行中最多可出现 255 次。用圆括号把 /KEY 子限定词括起来。
除了在 OpenVMS SORT 和 MERGE 中提供的之外, OpenVMS/Hanzi 的 SORT 和 MERGE 还支持下列子限定词。
SORT 或 MERGE 的 CSIZE子限定词只能用于汉字整理序列。n 是 SORT 或 MERGE 关键字的字符数长度。注意, 不能在一个关键字说明中同时指定 CSIZE 和 SIZE。 |
|
OpenVMS/Hanzi 的 SORT 和 MERGE提供一个命令限定词,通过该限定词传送一个输入文件说明。说明文件的默认文件类型是.SRT。指定该文件的命令格式如下:
$ SORT/SPECIFICATION=input-specification-file ...
在《OpenVMS User's Manual》中,说明文件的格式和功能有详述。
说明文件中的 /FIELD 限定词用来定义 SORT 或 MERGE 关键字字段,与 /KEY 命令限定词很类似。除了OpenVMS SORT 或 MERGE 公用程序中 /FIELD限定词的所有有效的子限定词外, OpenVMS/Hanzi SORT 和 MERGE 还把下列当作有效子限定词:
这些表示其相应整理序列的子限定词等于 /KEY命令限定词中相同子限定词。下面是说明文件中 /FIELD限定词的一个例子:
/FIELD=(NAME:Hanzi-field, POSITION:1, SIZE:4, PINYIN)
注意, 在一个 /FIELD 限定词内不能指定多个整理序列。如果要对一个关键字指定几种整理序列,则在说明文件中对同一关键字指定不同整理序列的多个 /FIELD 限定词。
李商隐 !"李"字之部首码 72 ,笔画 07 ,拼音 LI , 区位 3278
白居易 !"白"字之部首码 119,笔画 05 ,拼音 BAI , 区位1655
王维 !"王"字之部首码 70 ,笔画 04 ,拼音 WANG, 区位 4585
李白 !"李"字之部首码 72 ,笔画 07 ,拼音 LI , 区位 3278
孟浩然 !"孟"字之部首码 65 ,笔画 08 ,拼音 MENG, 区位 3547
$ SORT/KEY=(POSITION:1,CSIZE:1,RADICAL)POET.DAT RADICAL.DAT
孟浩然 !"孟"字之部首码 65 ,笔画 08 ,拼音MENG, 区位3547
王维 !"王"字之部首码 70 ,笔画 04 ,拼音WANG, 区位 4585
李白 !"李"字之部首码 72 ,笔画 07 ,拼音LI , 区位 3278
李商隐 !"李"字之部首码 72 ,笔画 07 ,拼音LI , 区位 3278
白居易 !"白"字之部首码 119,笔画 05 ,拼音BAI , 区位 1655
$ SORT/KEY=(POSITION:1,CSIZE:2,STROKE)POET.DAT STROKE.DAT
王维 !"王"字之部首码 70 , 笔画 04 ,拼音 WANG,区位 4585
白居易 !"白"字之部首码 119, 笔画 05 ,拼音 BAI ,区位 1655
李白 !"李"字之部首码 72 , 笔画 07 ,拼音 LI ,区位 3278
李商隐 !"李"字之部首码 72 , 笔画 07 ,拼音 LI ,区位 3278
孟浩然 !"孟"字之部首码 65 , 笔画 08 ,拼音 MENG,区位 3547
李商隐 !"李"字之部首码 72 ,笔画 07 ,拼音 LI , 区位 3278
白居易 !"白"字之部首码 119,笔画 05 ,拼音 BAI , 区位 1655
王维 !"王"字之部首码 70 ,笔画 04 ,拼音 WANG, 区位 4585
李白 !"李"字之部首码 72 ,笔画 07 ,拼音 LI , 区位 3278
孟浩然 !"孟"字之部首码 65 ,笔画 08 ,拼音 MENG, 区位 3547
杜甫 !"杜"字之部首码 72 ,笔画 07 ,拼音 DU , 区位 2237
$ SORT/KEY=(POSITION:1,CSIZE:2,STROKE,QUWEI) -_$ POET1.DAT STRQUWEI.DAT
王维 !"王"字之部首码70 ,笔画 04 ,拼音WANG, 区位 4585
白居易 !"白"字之部首码119,笔画 05 ,拼音BAI , 区位 1655
杜甫 !"杜"字之部首码72 ,笔画 07 ,拼音DU , 区位 2237
李白 !"李"字之部首码72 ,笔画 07 ,拼音LI , 区位 3278
李商隐 !"李"字之部首码72 ,笔画 07 ,拼音LI , 区位 3278
HMAIL 在 OpenVMS MAIL 公用程序上增加的特性,将会在以下的各节中逐一描述。有关 OpenVMS MAIL 公用程序的特性, 请参阅《OpenVMS User's Manual》。
HMAIL 让用户可以在个人名中包含汉字字符。例如,用户 TENG 要以汉字个人名发送文件 FILE.TXT 至用户 HANZI::LEE, 可以输入以下命令:
在 HMAIL 中, SEARCH 命令的检索字符串和 SELECT、SET FOLDER、DIRECTORY 以及 READ 命令的 /SUBJECT_SUBSTRING 限定词均可使用汉字。例如:
在 OpenVMS MAIL 中, 文件夹名只可以按 ASCII 整理序列显示。在 HMAIL 中, 用户可以指定根据汉字整理序列显示文件夹名。DIRECTORY/FOLDER 命令增加了一个新的限定词
/COLLATING_SEQUENCE, 语法如下:
以下规则适用于 /COLLATING_SEQUENCE 这个新的限定词:
在 DISK$USER:[USER]MAIL.MAI;1 中的文件夹列表
HMAIL>directory/folder/collating=(stroke,radical)
在 DISK$USER:[USER]MAIL.MAI;1 中的文件夹列表
HMAIL> directory/folder/collating=radical
在 DISK$USER:[USER]MAIL.MAI;1 中的文件夹列表
HMAIL> directory/folder/collating=ascii
在 DISK$USER:[USER]MAIL.MAI;1 中的文件夹列表
除了文件夹名显示的序列外, 在 /START 限定词中提供的值还会按选择的显示整理序列与文件夹名比较。因此, 您如果指定
/COLLATING=STROKE, 文件夹名的笔画整理值就会进行比较,以决定哪些文件夹名要显示出来。以下例子说明如何进行。
HMAIL> directory/folder/collating=stroke/start=记
在 DISK$USER:[USER]MAIL.MAI;1 中的文件夹列表
HMAIL>directory/folder/collating=radical/start=记
在 DISK$USER:[USER]MAIL.MAI;1 中的文件夹列表
HMAIL> directory/folder/collating=ascii/start=记
在 HMAIL 中, 会调用 HTPU 作为默认编辑程序。您可以使用 SET EDITOR 命令设置选择的编辑程序来取代此默认。例如,您可以用以下命令把默认编辑程序设置成其他的编辑程序:
HMAIL> set editor [其他编辑程序]2
HTPU 和 HEVE 增强 DECTPU 和 EVE 的功能,可支持汉字文本编辑和 HEDT 功能。这种公用程序既支持字符单元终端 (CCT) 用户接口, 也支持 DECwindows Motif/Hanzi 用户接口。
HTPU/HEVE 以 DECTPU/EVE 为基础, 由两层组成,即 HTPU (Hanzi Text Processing Utility) 及 HEVE (Hanzi Extensible Versatile Editor)。HEVE 通过 HTPU 内设过程调用汉字文本处理的功能。
要使用 CCT 接口调用 HTPU, 并以 HEVE 作为默认编辑程序, 您可使用以下的命令:
要使用 DECwindows Motif/Hanzi 接口调用 HTPU, 并以 HEVE 作为默认编辑程序, 您可使用以下的命令:
$ SET DISPLAY/CREATE/NODE=<您的工作站的节点名>
一旦启动 HEVE, 您可按键盘键输入文本。您也可以使用 HEVE 命令和预定义功能键对文本进行编辑。 表 9-1 列出那些预定义功能键。
有关 HEVE 及其命令的详情, 可参阅《HEVE 用户手册》, 或在 HEVE 内 按下 <DO> 键, 输入 HELP 命令。
HTPU 提供一套内设过程及可调用的接口,供用户编制汉字编辑程序。您可以仿照 HTPU 默认编辑程序 HEVE, 只运用 HTPU 语言及其内设过程编写编辑程序, 或透过可调用接口在应用程序中调用 HTPU。
有关一整套新的或经修改的内设过程的详情,可参阅《HTPU 和 HEVE 用户参考手册》。有关 DECTPU 内设过程的详情,可参阅《DEC Text Processing Utility Reference Manual》。《Guide to the DEC Text Processing Utility》描述 HTPU 语言。
HTPU 可调用接口的详情,可参阅本手册附录 B.4。有关 DECTPU 可调用接口的详情,请参阅《OpenVMS Utility Routines Manual》第 14 章。
HEVE 以 HTPU 语言及内设过程为基础,可以编辑汉字字符及 ASCII 字符。HEVE 支持 EVE 的所有功能3,且有下列扩充功能:
有关 HEVE 专有的命令,可参阅《HTPU 和 HEVE 用户参考手册》。有关 EVE 的命令, 可参阅《Extensible Versatile Editor Reference Manual》。
HDUMP 是 DUMP 的汉字版本, 可以用于显示和打印 DEC 汉字字符集的文件内容, 增强了 DUMP 公用程序。
HDUMP 和 DUMP 的主要区别在于 HDUMP 允许正确显示双字节汉字字符。当一行上只剩下一个字节而接着来的是一个双字 DUMP 便不能进行正确处理, DUMP 只会把该汉字的第一字节放在行末,把第二字节卸出到下一行上, 所以造成错误结果。然而,HDUMP 可把该汉字的第一、第二字节一同移到下一卸出行上,在显示字段的左边线前显示或打印一个 ASCII 字符位。
所有在认可汉字范围外的双字节代码均以句点 (.) 显示或打印。
Hdump of file WRKD$:[HANZI.SRC]HANZI.DAT;2 on 4-MAR-1991 15:16:48.94
File ID (3210,43,0) End of file block 1 / Allocated 3
Record number 1 (00000001), 39 (0027) bytes
ABBE3CB C6BCC3A3 C5A3C4A3 FAB9C0C3 美国DEC计算机 000000
2D33BAA3 B0BBE7B5 BECBABB9 DECFD0D3 有限公司电话:3- 000010
313132 35313337 7315211..........000020
Record number 2 (00000002), 36 (0024) bytes
CFD0D3FA BBE3CBC6 BC434544 FAB9C0C3 美国DEC计算机有000000
输入输出格式中的汉字日期和时间均受支持。另备有汉字语言表及预定义日期和时间输出格式。系统及用户进程如相应地设汉字日期和时间输出格式可在 DCL 命令 DIR 以及 DCL 公用程序 MAIL 和 HMAIL 中使用。此外,用户在定义自己的用户定义日期和时间输入及输出格式时,可以使用汉字语言表。这些日期和时间输入及输出格式可以由 OpenVMS RTL 的日期和时间操纵例行程序使用。有关日期和时间操纵例行程序及其用法的详述请参阅《VMS RTL Library (LIB$) Manual》。
用汉字日期时间前, 系统经理 (或有 CMEXEC、SYSNAM 和 SYSPRV 特权的用户) 必须执行命令过程 SYS$MANAGER:LIB$DT_STARTUP.COM, 以便为日期时间定义多种输出格式(包括预定义汉字输出格式)。此外,也可定义汉字日期时间单元。命令如下:
$ ! Define Hanzi output formats and date and time elements
汉字语言表可定义多个逻辑名。这些逻辑名可按 11.6 节的描述在用户定义输出格式中使用。下表列出这些逻辑名以作参考:
"一月", "二月","三月", "四月"," 五月", "六月", "七月", "八月", "九月", "十月","十一月", "十二月" |
||
要为日期或时间,或日期和时间两者选择一个特定的汉字格式,用户必须使用 11.3 节定义的逻辑名来定义 LIB$DT_FORMAT 逻辑名。例如:
$ DEFINE LIB$DT_FORMAT LIB$DATE_FORMAT_042,LIB$TIME_FORMAT_021
上述两个逻辑名的次序决定了其输出的次序。上述定义使日期以指定的格式输出日期后是一个空格, 之后是以指定格式表示的时间,如下所示:
用户可使用自己的执行态逻辑名以汉字来定义其个人的输出格式。例如:
$ DEFINE/EXEC/TABLE=LNM$DT_FORMAT_TABLELIB$DATE_FORMAT_601 -
$ DEFINE/EXEC/TABLE=LNM$DT_FORMAT_TABLE LIB$TIME_FORMAT_601 -
$ DEFINE LIB$DT_FORMAT LIB$DATE_FORMAT_601,LIB$TIME_FORMAT_601
要为日期时间输入选择一个特定的汉字格式以供应用,用户必须定义 LIB$DT_INPUT_FORMAT 逻辑名。LIB$DT_INPUT_FORMAT 的等效名可以包含 11.4 节所描述的预定义汉字语言表中的助忆符。
$ DEFINE LIB$DT_FORMAT LIB$DATE_FORMAT_043,LIB$TIME_FORMAT_021
1 NODEA:SYSTEM 1991年11月16日 星期六 作报告
$ DEFINE LIB$DT_FORMAT LIB$DATE_FORMAT_043,LIB$TIME_FORMAT_021
建立于: 1991年11月17日 星期日 下午 6月35分25秒
修订于: 1991年11月17日 星期日 下午 6月35分28秒 (1)
文件属性 : 分配: 3, 扩展: 0,全局缓冲计数: 0, 没有版本极限
记录属性: Carriage return carriage control
文件保护: System:RWED, Owner:RWED,Group:RE, World:
TEST.DAT;1 1991年11月17日 星期日 下午 6时35分25秒
TEST1.DAT;1 1991年11月17日 星期日 下午 6时36分19秒
TEST2.DAT;1 1991年11月17日 星期日 下午6时36分22秒
TEST3.DAT;1 1991年11月17日 星期日 下午 6时36分26秒
int lib$convert_date_string();
unsigned int quadtime[2]; /*quadword to store time */
unsigned char instr[40]; /*input date time buffer */
unsigned char outstr[40]; /*output date time buffer*/
struct dsc$descriptor_s indate = /*input descriptor */
{ 40, DSC$K_DTYPE_T, DSC$K_CLASS_S, instr };
struct dsc$descriptor_s outdate = /*output descriptor */
{ 40, DSC$K_DTYPE_T, DSC$K_CLASS_S, outstr };
outdate.dsc$a_pointer = outstr;
/* convert date time from input format to quadword storage*/
lib$convert_date_string(&indate,quadtime);
/* convert date time from quadword to output format */
lib$format_date_time(&outdate,quadtime);
printf("Output date time: %40.40s \n",outstr);
$ DEFINE LIB$DT_FORMAT LIB$DATE_FORMAT_043, LIB$TIME_FORMAT_021
$ DEFINE LIB$DT_INPUT_FORMAT -
_$ "!Y4年!MNB月!DB日 !MIU!HB2时!MB分!SB.!C2秒"
Input date time:1991年10月11日 下午2时16分26.02秒
Output date time:1991年10月11日 星期五 下午2时16分26秒
$ DEFINE LIB$DT_INPUT_FORMAT "!Y4年!MAU月!DB日 !HB4时!MB分!SB.!C2秒"
Input date time: 1991年十月11日 17时12分22.02秒
OpenVMS 调试器是一个符号调试器。它是调试用户模式代码的首选调试器。它支持字符单元用户界面和图形 (DECwindows Motif) 用户界面的所有 OpenVMS 编程语言的符号调试。这两种用户界面现在都支持 DEC 汉字字符集的输入和显示。在程序变量、源代码注释或 OpenVMS 调试器出错信息中的汉字字符都能够正确显示。
OpenVMS 调试器使用 XPG4 国际化模型实现对 DEC 汉字字符集的支持。它要求一个 DEC 汉字字符集的 XPG4 现场数据库。您可以在随同 OpenVMS 一起发行的 OpenVMS 118n 保存集中找到这个现场数据库。 |
本节描述如何设置 OpenVMS 调试器的字符单元用户界面和 DECwindows Motif 用户界面来使用汉字字符。
OpenVMS 调试器的字符单元用户界面一起使用汉字 SMG 和 DEC C 的 XPG4 本地化公用程序来支持 DEC 汉字字符集。要支持它,必须定义以下逻辑名:
这个逻辑名定义 OpenVMS 调试器用于支持屏幕模式的 SMG 共享映像的名称。要允许支持 DEC 汉字字符集,定义这个逻辑名如下:
$ DEFINE/JOB DBG$SMGSHR HSMGSHR
这个逻辑名定义汉字 SMG 支持的默认字符集。要允许支持 DEC 汉字字符集,定义这个逻辑名如下:
$ DEFINE/JOB SMG$DEFAULT_CHARACTER_SET HANZI
这个逻辑名为 DEC C 的 XPG4 本地化公用程序和运行时库的所有现场定义默认的现场设置。要允许在 OpenVMS 调试器中支持 DEC 汉字字符集,定义这个逻辑名如下:
OpenVMS 调试器的 DECwindows Motif 用户界面可以显示 DEC 汉字字符集中的字符。在目录 DECW$SYSTEM_DEFAULT 或DECW$USER_DEFAULTS 中的调试器资源文件 VMSDEBUG.DAT 可以为每个调试器窗口明确指定字体。
在 VMSDEBUG.DAT 中, DebugDefault.font 资源为所有调试器窗口指定一种默认字体。每个窗口也可以使用与默认字符的不同字体。要知详情,请参阅 VMSDEBUG.DAT 文件。
要允许在 OpenVMS 调试器窗口中支持 DEC 汉字字符集,该窗口必须使用 DEC 汉字字符集字体。可通过以下方法之一指定该字体:
OpenVMS/Hanzi 让用户在注释、字符和字符串文字中使用汉字,并在编程语言中能处理包含汉字的输入及输出数据。
下面列出一些如何在一般编程语言中使用汉字的样本程序。这些样本程序也包括 OpenVMS/Hanzi 系统的 HSY$EXAMPLE 目录下面。
VAX_MACRO = 1 ;If you want to compile this example
;with MACRO-32, then the VAX-MACRO symbol
;must be set to 0. Otherwise, you may
;encounter a problem during compilation.
DATA1: .ASCID /VAX MACRO 与汉字共用/
DATA2: STRING <VAX MACRO 中 MACRO 使用汉字>
.ENTRY SAMPLE, ^m<> ; 在注释中使用汉字.
HSYSHR 包括在 OpenVMS/Hanzi 系统的汉字处理运行时间库中, 这是个通用运行时间库, 载有提供基本汉字处理功能的例行程序。
在此系统备有关于这个库的联机求助。要知道这些例行程序的功能、调用格式、输入:
运行时间库包括在可共享映象库 HSYIMGLIB.OLB 中,您可用 OpenVMS/Hanzi 所支持的任何一种编程语言来调用库的功能。要把程序与运行时间库连接,输入:
$ LINK PROGRAM, SYS$LIBRARY:HSYIMGLIB/LIB
有关详情, 请参阅《OpenVMS/Hanzi RTL Chinese Processing (HSY$) Manual》。
$ TYPE HSY$EXAMPLE:SAMPLE_HSYSHR.C
This is a C language example to demostrate the
ability of the HSY$ facility of the OpenVMS
Run Time Library, HSYSHR. The program
accepts an input file from the command line and
formats the text within it in the following ways:
- Left margin = 0, Right margin = 40
- Convert all half form ASCII characters to their full
- Remove leading and trailing blanks of each
- Remove all embedded controls or space characters.
typedef unsigned char mstr; /*Local language string type */
typedef unsigned char *mstr_p;/* Pointer type to local */
typedef unsigned long mchar; /*Multi-byte character type*/
#define INPUT_STR_LEN 128 /* Max length of input line*/
#define OUTPUT_STR_LEN 128*2 /* Max length of output line */
#define MARGIN 40 /* Width of output text */
#define SUCCESS 1 /* Successful call */
#define FAILURE 0 /* Unsuccessful call */
#define SPACE 0x00000020 /* Space character in
extern HSY$IS_VALID(), /* External HSY$ routines to */
HSY$CH_RNEXT(),HSY$CH_WNEXT(),/* used */
HSY$CH_SIZE(), HSY$CH_NCHAR(), HSY$CH_NBYTE(),
HSY$CH_TRIM(), HSY$SKPC(), HSY$TRA_ROM_FULL();
FILE *fdin, /* Input file descriptor */
*fdout; /* Output file descriptor */
int line_length; /* Remaining number of bytes */
/* of the current output line*/
This routine will accept an input buffer and its length
in number of characters, and write the string to the
output file at 40 bytes per line. A blank line is printed
int write_text(buffer, buf_len)
mstr_p buffer; /* Output buffer */
int buf_len; /* Buffer length in number */
int char_size, /* Character size in bytes */
offset, /* Offset of input buffer */
mchar curr_char; /* Current multi-byte char */
mstr_p buf_ptr; /* Pointer to buffer */
if (buffer == NULL){ /* Empty line, next paragraph*/
if (line_length != EMPTY) fprintf(fdout,"\n");
offset=EMPTY;buf_ptr=buffer;/*Initialize for the loop */
for (i= EMPTY; i < buf_len; i++) {
curr_char = HSY$CH_RNEXT(&buf_ptr);
char_size = HSY$CH_SIZE(curr_char);
/* Calculate the size of the */
if (line_length < char_size) {
for (j=0; j < char_size; j++){
/* Put a multi-byte character*/
fputc(buffer[offset++], fdout);
This routine accepts an input string, removes its
railing and leading blanks, converts all half form ASCII
to their full forms and places the
converted string into a buffer which will be written to
mstr in_str[]; /* Zero terminated input */
mstr buffer[OUTPUT_STR_LEN];/* Output buffer */
mstr_p str_ptr, /* Pointer to source string */
dst_ptr; /* Pointer to dest. string */
mchar curr_char; /* Current multi-byte char */
int status, /* Return status */
pos, /* Position of trimmed string*/
charsofar, /* Character processed so far*/
noofchar, /* No. of characters and */
noofbytes; /* bytes in a string. */
if (!(str_ptr = HSY$SKPC(SPACE, in_str, strlen(in_str)-1)))
return write_text(NULL,EMPTY);/* Skip leading blanks */
pos = HSY$TRIM(str_ptr, strlen(str_ptr)-1);
if (!(HSY$TRA_ROM_FULL(str_ptr, pos, buffer, OUTPUT_STR_LEN, &noofbytes)))
return FAILURE; /* Convert to full form */
noofchar = HSY$CH_NCHAR(buffer,noofbytes);
str_ptr = dst_ptr = buffer;/* Initialize for the loop */
curr_char = HSY$CH_RNEXT(&str_ptr);
if (HSY$IS_VALID (curr_char)) {
/* Test for valid multi-byte */
HSY$CH_WNEXT(curr_char, &dst_ptr);
/* character and write to the*/
charsofar ++ ; /* destination. */
write_text(buffer, charsofar);
/* Write the text out to file*/
This main program check for a valid command line, open all
necessary files and call the appropriate routine to
mstr in_str[INPUT_STR_LEN]; /* Input line */
printf("Usage: $ FORMAT <input_file> <output_file>\n");
if ((fdin = fopen(argv[1], "r")) == NULL) {
printf("Error: Cannot open input file %s.\n", argv[1]);
if ((fdout = fopen(argv[2],"w")) == NULL) {
printf("Error: Cannot open output file %s.\n", argv[2]);
while (fgets(in_str, INPUT_STR_LEN, fdin) != NULL)
printf("Information: Processing error.\n");
printf("Information: Finish Processing.\n");
$ LINK SAMPLE_HSYSHR, SYS$LIBRARY:HSYIMGLIB/LIB
OpenVMS/Hanzi 系统包括汉字屏幕管理运行时间库 HSMGSHR 。它由一组例行程序组成,这些例行程序有助于在影象屏幕上设计、构成和监视屏幕映象。
HSMGSHR 提供两种重要功能:使程序不受终端特性转换的影响; 易于构成屏幕映象。
您可用 OpenVMS/Hanzi 所支持的任何一种编程语言来调用库功能。要把程序与 HSMGSHR 连接, 输入:
$ LINK PROGRAM, SYS$INPUT/OPTION
有关详情, 请参阅《OpenVMS RTL Chinese Screen Management (SMG$) Manual》。
这些例行程序使您能把排序或合并操作加入到程序应用中去处理汉字数据记录、把这些汉字数据记录排序或合并,然后再处理之。
请参阅《OpenVMS Utility Routine Reference Manual》。
任何支持 OpenVMS 过程调用及条件处理标准的语言都可调用以上的例行程序。为了使用 OpenVMS/Hanzi 的 SORT 和 MERGE 可调用程序,应用程序必须使用以下命令来与运行时间库连接:
例行程序被调用后会执行本身的功能,然后送回控制到调用程序去。
所有的串参数按描述符传送,而所有的标量参数则按地址传送。这些参数都是位置参数,用户可按值传送一个零来指定任选参数。调用程序后传送一个缩短列表可以省略详情见《OpenVMS Utility Routine Reference Manual》。
用户可用下列的伪数据类型来指定汉字整理序列,这些伪数据类型以通用符号 (universal symbols) 的形式出现供用户使用。
上述可调用例行程序在处理汉字数据时送回的状态码与处理 ASCII 数据时送回的状态码相同。有关详情,请参阅《OpenVMS Utility Routine Reference Manual》。
用户可把数据以完整文件或单个记录的形式提交可调用例行程序。当您的程序提您就在使用文件接口。当您的程序一次提交一个记录,然后一次接收一个已排序记录时,
用户要结合文件接口与记录接口, 可在输入时提交文件,并在输出时接收已排序记录。另一个可行的方法是在输入时释放记录,并在输出时把已排序记录写入一个文件中。将这两个接口连接起来具有更大的灵活性。
$ TYPE HSY$EXAMPLE:SAMPLE_SORT1.FOR
C The following FORTRAN program sorts the records in the file
C POET.DAT and creates an output file named EXAM1OUT.DAT.
C All the records in the input file are sorted in Pinyin
C collating sequence based on the first 12 bytes, that is,
C the first 6 Chinese characters in each record.
DATA IN_FILE, OUT_FILE /'POET.DAT','EXAM1OUT.DAT'/
KEYBUFF(1) = 1 ! Number of KEY
KEYBUFF(2) = %LOC(SOR$K_SEQ_PINYIN)
KEYBUFF(3) = 0 ! Ascending sort
KEYBUFF(5) = 2 ! Size in bytes
STATUS = SOR$PASS_FILES(IN_FILE, OUT_FILE)
$ TYPE HSY$EXAMPLE:SAMPLE_SORT2.FOR
C This is a FORTRAN language example calling sort routines using
C multiple collating sequences.
C This program sorts data with file interface on input and record
C interface on output.Two collating sequences are specified here,
C the first being the number of stroke count with ascending sort
C order and the second being the radical sequence with descending
C Define external functions and data and initialize
CHARACTER*9 INPUTNAME ! Input file name
INTEGER*2 KEYBUF(9) ! Key definition buffer
EXTERNAL SOR$K_SEQ_STROKE ! Stroke collating sequence
KEYBUF(2) = %LOC(SOR$K_SEQ_STROKE) ! Primary key STROKE
KEYBUF(6) = %LOC(SOR$K_SEQ_RADICAL)
ISTATUS = SOR$PASS_FILES(INPUTNAME)
C Initialize the work areas and keys
ISTATUS = SOR$BEGIN_SORT(KEYBUF,,,,,,SRTTYPE,%REF(3))
C Now retrieve the individual records and display them.
5 ISTATUS = SOR$RETURN_REC(RECBUF)
ISTATUS = LIB$PUT_OUTPUT(RECBUF)
6 IF (ISTATUS .EQ. %LOC(SS$_ENDOFFILE)) GOTO 7
$ TYPE HSY$EXAMPLE:SAMPLE_MERGE.C
/* This is a C language example.
This program merges two input files into one output file.
The key is starting from the first byte of the record
(offset zero byte) of size two bytes(i.e. 1 Chinese
character).It also checks if the input files sequence
struct DESCRIPTOR { int leng ;
char infile1[] = "EXAM31.DAT" ,
inptr1 = {strlen(infile1) ,infile1},
inptr2 = {strlen(infile2) ,infile2},
outptr = {strlen(outfile) ,outfile};
key[1] = SOR$K_SEQ_PINYIN ; /* pinyin */
option = SOR$M_SEQ_CHECK; /* check input sequence */
if(!((status=sor$pass_files(&inptr1,&outptr))
if(!((status=sor$pass_files(&inptr2))
由于可调用 HTPU 例行程序关系,您可从任何程序语言及应用程序中调用 HTPU。您可从以任何使用 OpenVMS 过程调用及条件处理标准生成调用的编程语言编写的程序中调用 HTPU。 您也可以从 OpenVMS 公用程序如 HMAIL 中调用 HTPU。 可调用 HTPU 例行程序容许您在程序中使用汉字文本处理功能。
HTPU 支持 DECTPU 所支持的同一可调用接口,即简化可调用接口和全面可调用接口。有关 DECTPU 可调用接口的详情, 请参阅《VMS Utility Routines Manual》第 14 章。
简而言之,HTPU 可调用接口和 DECTPU 可调用接口的分别如下:
以下是用 BLISS 编写的样本程序,以使用全面可调用接口调用 HTPU:
! Example program of using HTPU full callable interface.
! 2. $ LINK EXAMPLE,SYS$INPUT/OPTION
! 3. $ DEFINE HTPU$TESTING <your directory>
ADDRESSING_MODE (EXTERNAL = GENERAL)) =
! To test the callable interface of HTPUSHR
TEST_USER_ARG = %X'F0'; !an arbitrary pattern
test_callback, ! Callback for tpu$initialize
test_call_user, ! Call user routine
tpu$fileio, ! HTPU file routine
tpu$message, ! Displays HTPU message
tpu$cliparse, ! HTPU CLI parser
tpu$initialize, ! Initialize HTPU
tpu$execute_inifile, ! Execute initial commands
tpu$execute_command, ! Execute HTPU statements
tpu$control, ! HTPU main control loop
callback_bpv : BLOCK [8, BYTE],
! Setup the callback procedure
$test_set_bpv (callback_bpv, test_callback);
!Set the user argument for test_callback,but ignored there
!Initialize HTPU. Initialization options are specified in
status = tpu$initialize (callback_bpv, .user_arg);
! Set up the default section file
status = tpu$execute_inifile();
! Finally, we clean up the HTPU and then return
cleanup_flag = tpu$m_delete_context;
RETURN tpu$cleanup (cleanup_flag);
ROUTINE test_callback (user_arg) =
! Sets up the item list for tpu$initialize
call_user_bpv : BLOCK [8, BYTE],
$test_set_bpv (fileio_bpv, tpu$fileio);
$test_set_bpv (call_user_bpv, test_call_user);
! Calls tpu$cliparse to construct item list for
! passing it tpu$fileio as the fileio routine and
! test_call_user as the call_user routine
$DESCRIPTOR ('HTPU htpu$testing:test.txt'),
ROUTINE test_call_user (int_param,
str_out : REF BLOCK [,BYTE]) =
! It simply prints out the integer parameter int_param
! and the string parameter str_param by means of tpu$message
buffer_desc : BLOCK [8, BYTE],
! Form a fixed-length string descriptor
buffer_desc [DSC$W_LENGTH] = 80;
buffer_desc [DSC$B_DTYPE] = DSC$K_DTYPE_T;
buffer_desc [DSC$B_CLASS] = DSC$K_CLASS_S;
buffer_desc [DSC$A_POINTER] = buffer;
! Construct the ini_param message and print it out
status = $FAO ($DESCRIPTOR('Integer: !UL'),buffer_len,
buffer_desc [DSC$W_LENGTH] = .buffer_len;
status = tpu$message (buffer_desc);
buffer_desc [DSC$W_LENGTH] = 80;
! Construct the str_param message and print it out
status = $FAO ($DESCRIPTOR('String: !AF'), buffer_len,
buffer_desc, .str_param [DSC$W_LENGTH],
buffer_desc [DSC$W_LENGTH] = .buffer_len;
status = tpu$message (buffer_desc);
buffer_desc [DSC$W_LENGTH] = 80;
! We need to use lib$sget1_dd to allocate the memory
! for the return string since TPU uses lib$sfree1_dd
! to free our string when it needs to.
str_out_len = %CHARCOUNT(%STRING('Success'));
status = lib$sget1_dd (str_out_len, str_out [0,0,0,0]);
! Perform editing to the buffer
status=tpu$execute_command ($DESCRIPTOR (command));
! It first copies two lines to the MAIN buffer
$test_execute ('COPY_TEXT("This is the first statement");
$test_execute('COPY_TEXT("This is the second statement");