如何在 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 等的默认转换,而必须通过函数显式转换。