2016-09-26 95 views
0

我需要将文本文件从utf8转换为cp1251。我不能使用任何第三方软件。有没有用COBOL编写的例程?它是Windows上的Micro Focus Cobol。用于文件编码转换的COBOL程序

+0

这是一个简单的读写程序。然后查看Micro Focus网站上的各种文档,了解如何将Unicode转换为代码页。 –

+0

“我不能使用任何第三方软件?”然而,你正在提议编写另一种工具,这种工具在我看来很像第三方软件。 –

+0

虽然它可能被视为第三方,但可以在文本编辑器(如TextPad或NotePad ++或Crimson Editor或...)中打开该文件,并保存为其他编码。如果你需要告诉管理员“它是用COBOL编写的”,那么“CALL”SYSTEM“USING”a-batchfile-invoking-a-scriptable-editor-with-this-filename“ –

回答

5

答:有很多COBOL程序的该书面...

我不知道任何免费的(=开源与自由的实际使用它)的实现,但你可以很容易地把它写在你的拥有。 只需通过源代码并将其移动到目标,如果cp1251中没有可用的符号,则使用'?'管他呢。 这里唯一的工作是:你需要查找x'80'以上的128个字符......

或者你检查MF是否有一些特定的扩展名或者你自己写的。 在SO上没有“请为我编码”,所以你应该显示你已经试过的东西。

为了让你的想法看看的this javascript sample转换,应该是这样的(未测试的代码):

 77 utf-8-field  PIC X(5000). 
     77 new-char  PIC X. 
     77 cp1251-field PIC X(5000). 
     77 utf-8-pos  PIC 9(04) COMP-5. 
     77 cp1251-pos  PIC 9(04) COMP-5. 
     77 utf-8-end  PIC 9(04) COMP-5. 

     MOVE FUNCTION LENGTH (FUNCTION TRIM (utf-8-field TRAILING)) 
     TO utf-8-end 
     MOVE 1 TO cp1251-pos 
     PERFORM VARYING utf-8-pos FROM 1 BY 1 
       UNTIL utf-8-pos = utf-8-end 
      EVALUATE TRUE 
      *> normal ASCII character 
      WHEN utf-8-field (utf-8-pos) < x'80' 
       MOVE utf-8-field (utf-8-pos) TO new-char 
      *> UTF-8 in CP1251 range 
      WHEN utf-8-field (utf-8-pos) < x'04' 
       *> skip the first byte 
       ADD 1 TO utf-8-pos 
       EVALUATE TRUE 
        WHEN utf-8-pos > utf-8-end 
         MOVE '?' TO new-char 
        WHEN utf-8-field (utf-8-pos) = x'51' 
         MOVE x'B8' TO new-char 
        WHEN utf-8-field (utf-8-pos) >= x'4F' 
         MOVE '?' TO new-char 
        *> alternative: use alphabet conversion here 
        WHEN utf-8-field (utf-8-pos) = x'01' 
         MOVE x'A8' TO new-char 
        WHEN OTHER 
         MOVE utf-8-field (utf-8-pos) TO new-char 
         INSPECT new-char CONVERTING x'0203 ... 
             TO   x'B2B2 ... 
       END-EVALUATE 
      *> UTF-8 with no CP1251 char 
      *> Todo: check for other multibyte headers and add the correct 
      *>  number of characters to utf-8-pos 
      *> WHEN ... 
      WHEN OTHER 
       MOVE '?' TO new-char 
      END-EVALUATE 
      STRING new-char 
       DELIMITED BY SIZE 
       INTO cp1251-field 
       WITH POINTER cp1251-pos 
      END-STRING 
     END-PERFORM 

您可能希望定义一个ALPHABETCONVERTING x'0203 ... TO x'B2B3 ...部分:

 SPECIAL-NAMES. 
      ALPHABET UTF8-PART-2 IS x'01', x'02' THRU x'4F', x'51'. 
      ALPHABET CP1251  IS x'A8', x'B2' THRU x'FF', x'B8'. 

和内EVALUATE使用

  MOVE utf-8-field (utf-8-pos) TO new-char 
      INSPECT new-char CONVERTING UTF8-PART-2 TO CP1251