首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >COBOL问题- UNICODE

COBOL问题- UNICODE
EN

Stack Overflow用户
提问于 2011-05-11 13:33:10
回答 4查看 4.3K关注 0票数 4

我们目前正在寻求将遗留的COBOL代码从ANSII转换为UNICODE,但是我们遇到了一个问题,当数据结构包含使用PIC 9字段的基本数据项的重新定义或重命名语句时,仅将PIC X字段更改为PIC N并设置NSYMBOL(国家)将会导致问题。

代码语言:javascript
复制
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中获得无效数据。

代码语言:javascript
复制
MOVE 123456 TO WS-NUM.
MOVE N"ABCDEFGHIJKLM" TO WS_DATA.

上面的内容是正确的,但是如果我检查WS-RECORD,我会看到?ABCDEFGHIJKLM在哪里?是十六进制的X"313233343536“。

我们的问题是,根据记录类型标识符,我们有多个数据记录,我们还在许多链接项上使用重定义。

有没有人有从传统的ASCII转换到UNICODE的经验?

EN

回答 4

Stack Overflow用户

发布于 2011-05-11 18:42:46

代码语言:javascript
复制
02 WS-NUM PIC 9(6) USAGE NATIONAL.

应该可以工作(至少在IBM编译器上)。

票数 3
EN

Stack Overflow用户

发布于 2011-05-17 12:24:20

MicroFocus建议的解决方案如下:

WS-NCHAR-1和WS-NCHAR-FIELD的大小不同,因为“pic9(6)”的大小是“pic(6)”的一半。

因此,快速但不整洁的解决方案是放置一个填充符,然后使用“FUNCTION DISPLAY- of”重新更正字段,尽管这种方法有效,但客户确实需要了解“pic”的大小与“pic9”的大小不同,因此在使用redefines和转换期间需要小心。

一个调整过的示例,它应该向您展示我在代码…中的意思

代码语言:javascript
复制
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字段。

谢谢你的帮助。

票数 3
EN

Stack Overflow用户

发布于 2011-05-16 23:28:52

如果我理解正确的话,您希望通过X'3900‘到X'39’将X'3000‘转换为X'30',将X'3100’转换为X'31,依此类推。

代码语言:javascript
复制
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.

该过程如下所示:

代码语言:javascript
复制
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.

调用该过程如下所示:

代码语言:javascript
复制
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-INPUTWS-ASCII-OUTPUT字段更大一些。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5959709

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档