我们目前正在寻求将遗留的COBOL代码从ANSII转换为UNICODE,但是我们遇到了一个问题,当数据结构包含使用PIC 9字段的基本数据项的重新定义或重命名语句时,仅将PIC X字段更改为PIC N并设置NSYMBOL(国家)将会导致问题。
01 WS-RECORD PIC N(26).
01 WS-RECORD-1 REDEFINES WS-RECORD.
02 WS-NUM PIC 9(6).
02 WS-DATA PIC N(20).
MOVE N"123456ABCDEFGHIJKLM" TO WS-RECORD.在上面所移动的字符串将是UTF-16格式,因此字段WS-NUM将被破坏,因为它将包含X"310032003300“,这是一个无效的数字,WS-DATA将包含X"3400350036004100..etc
问题是,当使用国家(UTF-16)数据类型时,如何处理数字,以便在重新定义之后获得正确的数据。
我可以通过执行以下操作使其正常工作,但将在其他WS-RECORD中获得无效数据。
MOVE 123456 TO WS-NUM.
MOVE N"ABCDEFGHIJKLM" TO WS_DATA.上面的内容是正确的,但是如果我检查WS-RECORD,我会看到?ABCDEFGHIJKLM在哪里?是十六进制的X"313233343536“。
我们的问题是,根据记录类型标识符,我们有多个数据记录,我们还在许多链接项上使用重定义。
有没有人有从传统的ASCII转换到UNICODE的经验?
发布于 2011-05-11 18:42:46
02 WS-NUM PIC 9(6) USAGE NATIONAL.应该可以工作(至少在IBM编译器上)。
发布于 2011-05-17 12:24:20
MicroFocus建议的解决方案如下:
WS-NCHAR-1和WS-NCHAR-FIELD的大小不同,因为“pic9(6)”的大小是“pic(6)”的一半。
因此,快速但不整洁的解决方案是放置一个填充符,然后使用“FUNCTION DISPLAY- of”重新更正字段,尽管这种方法有效,但客户确实需要了解“pic”的大小与“pic9”的大小不同,因此在使用redefines和转换期间需要小心。
一个调整过的示例,它应该向您展示我在代码…中的意思
01 ONE-PICN PIC N.
01 ONE-PIC9 PIC 9.
01 WS-NCHAR-FIELD PIC N(20).
01 WS-NCHAR-1 REDEFINES WS-NCHAR-FIELD.
02 WS-NUM PIC 9(6).
02 FILLER PIC X(6).
02 WS-REST PIC N(14).
DISPLAY "PIC N SIZE : " length of ONE-PICN
DISPLAY "PIC 9 SIZE : " length of ONE-PIC9
DISPLAY "WS-NCHAR-FIELD : " length of WS-NCHAR-FIELD
DISPLAY "WS-NCHAR-1 : " length of WS-NCHAR-1
DISPLAY "WS-REST : " length of WS-REST
DISPLAY "WS-NUM : " length of WS-NUM
MOVE N"123456ABCDEFGHIJKLM" TO WS-NCHAR-FIELD.
MOVE FUNCTION DISPLAY-OF(WS-NCHAR-FIELD(1:6),1252) TO WS-NUM
DISPLAY "WS-NUM : " WS-NUM DISPLAY "WS-REST : " WS-REST上面的方法不适用于S9(n) COMP或S9(n)V9(n) ELEMENTRY ITEMS,使用VISUAL COBOL我发现我可以直接将数值移动到PIC (N)元素中,然后使用函数NUMVAL()来获得实际的数值,我还没有尝试使用Signed/COMP和decimal字段。
谢谢你的帮助。
发布于 2011-05-16 23:28:52
如果我理解正确的话,您希望通过X'3900‘到X'39’将X'3000‘转换为X'30',将X'3100’转换为X'31,依此类推。
01 WS-NUMERIC-CONVERSION.
05 WS-LOOP-COUNT PIC S9(04) COMP.
05 WS-NATIONAL-POSITION PIC S9(04) COMP.
05 WS-NUMBER-OF-CHARACTERS PIC S9(04) COMP.
05 WS-NATIONAL-INPUT.
10 WS-NATIONAL-INPUT-BYTE PIC X
OCCURS 40 TIMES.
05 WS-ASCII-OUTPUT.
10 WS-ASCII-OUTPUT-BYTE PIC X
OCCURS 20 TIMES.该过程如下所示:
NATIONAL-TO-ASCII.
PERFORM VARYING WS-LOOP-COUNT FROM 1 BY 1
UNTIL WS-LOOP-COUNT > WS-NUMBER-OF-CHARACTERS
COMPUTE WS-NATIONAL-POSITION = WS-LOOP-COUNT + WS-LOOP-COUNT - 1
MOVE WS-NATIONAL-INPUT-BYTE(WS-NATIONAL-POSITION)
TO WS-ASCII-OUTPUT-BYTE(WS-LOOP-COUNT)
END-PERFORM.调用该过程如下所示:
05 WS-NATIONAL-NUMBER-X.
10 WS-NATIONAL-NUMBER PIC N(06).
05 WS-ASCII-NUMBER-X.
10 WS-ASCII-NUMBER PIC 9(06).
MOVE something TO WS-NATIONAL-NUMBER
MOVE WS-NATIONAL-NUMBER-X TO WS-NATIONAL-INPUT
MOVE +6 TO WS-NUMBER-OF-CHARACTERS
PERFORM NATIONAL-TO-ASCII
MOVE WS-ASCII-OUTPUT TO WS-ASCII-NUMBER-X
MOVE WS-ASCII-NUMBER TO something else我定义的过程工作存储可以处理最多20个字符的数字。如果这还不够,可以让WS-NATIONAL-INPUT和WS-ASCII-OUTPUT字段更大一些。
https://stackoverflow.com/questions/5959709
复制相似问题