如何在 cobol 中显示国家字段?
How can you display a national field in cobol?
我喜欢在我编写的程序的测试驱动程序中显示,以查看发生了什么。就我而言,我正在使用包含 PIC N 字段的抄写本。
我想显示以下字段: 05 MESSAGE-TEXT PIC N(20).
正常的 DISPLAY MESSAGE-TEXT IN COPYBOOK
让我无法阅读。我是否必须定义一个新字段,例如 PIC-X-FIELD,使用 MOVE FUNCTION DISPLAY-OF ( MESSAGE-TEXT IN COPYBOOK ) TO PIC-X-FIELD
然后显示该 PIC-X-FIELD?或者有更简单的方法吗?
当您在输出中查看十六进制的国家 (PIC N) 字段时看到的乱码是该国家字段的十六进制值。它是该字段的 UTF-8 值。对于 "ordinary" 个字符,这将是一个字节的二进制零,后跟字符的 "ASCII" 代码。
大写字母"A",例如X'0041'。
使用国家字段时,您通常不必使用 FUNCTION NATIONAL-OF 进行转换。例如,对于从 PIC X 到 PIC N 的简单移动,编译器知道您想要什么,并生成实现转换所需的代码。
转换不是自动的一个地方是... DISPLAY
。
但是,您可以在 DISPLAY 中使用 FUNCTION DISPLAY-OF ( ... ) 来获取输出。
这里有一个简短的程序来说明上面的内容(并且还显示了一个参考修改的 FUNCTION with DISPLAY 的另一种用法):
WORKING-STORAGE SECTION.
01 W-WHEN-COMPILED PIC X(8)BX(8).
01 A-NATIONAL PIC N(1) VALUE "A".
01 A-DISPLAY PIC X VALUE "?".
PROCEDURE DIVISION.
MOVE WHEN-COMPILED TO W-WHEN-COMPILED
DISPLAY "PROGRAM-NAME COMPILED ON " W-WHEN-COMPILED
DISPLAY
FUNCTION WHEN-COMPILED
DISPLAY
"DATE COMPILED (YYYY-MM-DD): "
FUNCTION WHEN-COMPILED ( 1 : 4 )
"-"
FUNCTION WHEN-COMPILED ( 5 : 2 )
"-"
FUNCTION WHEN-COMPILED ( 7 : 2 )
" TIME: "
FUNCTION WHEN-COMPILED ( 9 : 2 )
":"
FUNCTION WHEN-COMPILED ( 11 : 2 )
":"
FUNCTION WHEN-COMPILED ( 13 : 2 )
" OFFSET TO GMT:"
FUNCTION WHEN-COMPILED ( 17 : 5 )
PERFORM DO-THE-DISPLAYS
ACCEPT A-DISPLAY
MOVE A-DISPLAY TO A-NATIONAL
PERFORM DO-THE-DISPLAYS
ACCEPT A-DISPLAY
MOVE FUNCTION NATIONAL-OF
( A-DISPLAY ) TO A-NATIONAL
PERFORM DO-THE-DISPLAYS
GOBACK
.
DO-THE-DISPLAYS.
DISPLAY
"THE NATIONAL, NATIVE>"
A-NATIONAL
"<"
DISPLAY
"THE DISPLAY, NATIVE >"
A-DISPLAY
"<"
DISPLAY
"THE DISPLAY-OF FUNC >"
FUNCTION DISPLAY-OF
( A-NATIONAL )
"<"
.
一些JCL到运行吧:
//stepname EXEC PGM=program,TIME=(,2) nice to limit things always
//STEPLIB DD DISP=SHR,DSN=your executable library
//SYSOUT DD SYSOUT=*
//SYSIN DD *
C
D
输出为:
04/13/16 09.28.21
2016041309282183+0000
DATE COMPILED (YYYY-MM-DD): 2016-04-13 TIME: 09:28:21 OFFSET TO GMT:+0000
THE NATIONAL, NATIVE> <
THE DISPLAY, NATIVE >?<
THE DISPLAY-OF FUNC >A<
THE NATIONAL, NATIVE> <
THE DISPLAY, NATIVE >C<
THE DISPLAY-OF FUNC >C<
THE NATIONAL, NATIVE> <
THE DISPLAY, NATIVE >D<
THE DISPLAY-OF FUNC >D<
国家的十六进制:
THE NATIONAL, NATIVE> <
ECC4DCECDDCD64DCECEC6044
385051396513B0513955E01C
-----------------------
THE NATIONAL, NATIVE> <
ECC4DCECDDCD64DCECEC6044
385051396513B0513955E03C
-----------------------
THE NATIONAL, NATIVE> <
ECC4DCECDDCD64DCECEC6044
385051396513B0513955E04C
请注意,您的 FUNCTION WHEN-COMPILED 输出可能不同,我从未将它与 COBOL 一起用于 OS/390 和 VM。另外日期的格式可能不同,一个安装选项。
另外,FUNCTION DISPLAY-OF(和 NATIONAL-OF)也不能将代码页作为第二个参数。如果您碰巧要求 National 使用与默认代码页不同的代码页(并且无法 to/didn 不想将代码页指定为编译器选项,或者需要在同一程序中输出多个代码页),您可以在函数中指定代码页以获得正确的输出。在这些类型的情况下,您不能使用 MOVE 等的默认转换,而必须通过函数显式转换。
我喜欢在我编写的程序的测试驱动程序中显示,以查看发生了什么。就我而言,我正在使用包含 PIC N 字段的抄写本。
我想显示以下字段: 05 MESSAGE-TEXT PIC N(20).
正常的 DISPLAY MESSAGE-TEXT IN COPYBOOK
让我无法阅读。我是否必须定义一个新字段,例如 PIC-X-FIELD,使用 MOVE FUNCTION DISPLAY-OF ( MESSAGE-TEXT IN COPYBOOK ) TO PIC-X-FIELD
然后显示该 PIC-X-FIELD?或者有更简单的方法吗?
当您在输出中查看十六进制的国家 (PIC N) 字段时看到的乱码是该国家字段的十六进制值。它是该字段的 UTF-8 值。对于 "ordinary" 个字符,这将是一个字节的二进制零,后跟字符的 "ASCII" 代码。
大写字母"A",例如X'0041'。
使用国家字段时,您通常不必使用 FUNCTION NATIONAL-OF 进行转换。例如,对于从 PIC X 到 PIC N 的简单移动,编译器知道您想要什么,并生成实现转换所需的代码。
转换不是自动的一个地方是... DISPLAY
。
但是,您可以在 DISPLAY 中使用 FUNCTION DISPLAY-OF ( ... ) 来获取输出。
这里有一个简短的程序来说明上面的内容(并且还显示了一个参考修改的 FUNCTION with DISPLAY 的另一种用法):
WORKING-STORAGE SECTION.
01 W-WHEN-COMPILED PIC X(8)BX(8).
01 A-NATIONAL PIC N(1) VALUE "A".
01 A-DISPLAY PIC X VALUE "?".
PROCEDURE DIVISION.
MOVE WHEN-COMPILED TO W-WHEN-COMPILED
DISPLAY "PROGRAM-NAME COMPILED ON " W-WHEN-COMPILED
DISPLAY
FUNCTION WHEN-COMPILED
DISPLAY
"DATE COMPILED (YYYY-MM-DD): "
FUNCTION WHEN-COMPILED ( 1 : 4 )
"-"
FUNCTION WHEN-COMPILED ( 5 : 2 )
"-"
FUNCTION WHEN-COMPILED ( 7 : 2 )
" TIME: "
FUNCTION WHEN-COMPILED ( 9 : 2 )
":"
FUNCTION WHEN-COMPILED ( 11 : 2 )
":"
FUNCTION WHEN-COMPILED ( 13 : 2 )
" OFFSET TO GMT:"
FUNCTION WHEN-COMPILED ( 17 : 5 )
PERFORM DO-THE-DISPLAYS
ACCEPT A-DISPLAY
MOVE A-DISPLAY TO A-NATIONAL
PERFORM DO-THE-DISPLAYS
ACCEPT A-DISPLAY
MOVE FUNCTION NATIONAL-OF
( A-DISPLAY ) TO A-NATIONAL
PERFORM DO-THE-DISPLAYS
GOBACK
.
DO-THE-DISPLAYS.
DISPLAY
"THE NATIONAL, NATIVE>"
A-NATIONAL
"<"
DISPLAY
"THE DISPLAY, NATIVE >"
A-DISPLAY
"<"
DISPLAY
"THE DISPLAY-OF FUNC >"
FUNCTION DISPLAY-OF
( A-NATIONAL )
"<"
.
一些JCL到运行吧:
//stepname EXEC PGM=program,TIME=(,2) nice to limit things always
//STEPLIB DD DISP=SHR,DSN=your executable library
//SYSOUT DD SYSOUT=*
//SYSIN DD *
C
D
输出为:
04/13/16 09.28.21
2016041309282183+0000
DATE COMPILED (YYYY-MM-DD): 2016-04-13 TIME: 09:28:21 OFFSET TO GMT:+0000
THE NATIONAL, NATIVE> <
THE DISPLAY, NATIVE >?<
THE DISPLAY-OF FUNC >A<
THE NATIONAL, NATIVE> <
THE DISPLAY, NATIVE >C<
THE DISPLAY-OF FUNC >C<
THE NATIONAL, NATIVE> <
THE DISPLAY, NATIVE >D<
THE DISPLAY-OF FUNC >D<
国家的十六进制:
THE NATIONAL, NATIVE> <
ECC4DCECDDCD64DCECEC6044
385051396513B0513955E01C
-----------------------
THE NATIONAL, NATIVE> <
ECC4DCECDDCD64DCECEC6044
385051396513B0513955E03C
-----------------------
THE NATIONAL, NATIVE> <
ECC4DCECDDCD64DCECEC6044
385051396513B0513955E04C
请注意,您的 FUNCTION WHEN-COMPILED 输出可能不同,我从未将它与 COBOL 一起用于 OS/390 和 VM。另外日期的格式可能不同,一个安装选项。
另外,FUNCTION DISPLAY-OF(和 NATIONAL-OF)也不能将代码页作为第二个参数。如果您碰巧要求 National 使用与默认代码页不同的代码页(并且无法 to/didn 不想将代码页指定为编译器选项,或者需要在同一程序中输出多个代码页),您可以在函数中指定代码页以获得正确的输出。在这些类型的情况下,您不能使用 MOVE 等的默认转换,而必须通过函数显式转换。