1

我有一个字符串变量,其中包含我需要在UTF-16LE代码页中编码并写入文件的文本。

目前,以下代码生成一个UTF-8文件,我在语句中看不到任何选项OPEN DATASET来生成UTF-16LE.

REPORT zmyprogram.

DATA(filename) = `/tmp/myfile`.

OPEN DATASET filename IN TEXT MODE ENCODING DEFAULT FOR OUTPUT.

TRANSFER 'HELLO WORLD' TO filename.

CLOSE DATASET filename.

我想一种解决方案是首先在内存中对字符串进行编码,然后将编码后的字节写入文件。

一般来说,如何在内存中将一串字符编码为给定的代码页?

4

1 回答 1

4

在第一部分中,我解释了如何将字符串编码到给定的代码页中(全部在内存中完成),在第二部分中,我具体解释了如何在给定的代码页中将文件写入应用程序服务器。

  1. 一般方式(全在内存中)

如果必须对字符串(类型STRING)进行编码,则结果必须存储在与内置数据类型相对应的字节字符串中XSTRING

有几种可能性取决于 ABAP 版本;我用 :

  • 从 7.53 开始,使用类CL_ABAP_CONV_CODEPAGE

    DATA(xstring) = cl_abap_conv_codepage=>create_out(codepage = `UTF-16LE`)->convert(source = `ABCDE`)。

  • 从 7.02 开始,使用类CL_ABAP_CODEPAGE

    数据 xstring 类型 xstring。

    xstring = cl_abap_codepage=>convert_to(source = `ABCDE` codepage = `UTF-16LE`)。

  • 在 7.02 之前,使用类CL_ABAP_CONV_OUT_CE(随类提供的文档):

    首先,实例化转换对象,使用 SAP 代码页号而不是 ISO 名称(如下所示的值列表):

    数据:conv TYPE REF TO CL_ABAP_CONV_OUT_CE,xstring TYPE xstring。

    转换 = CL_ABAP_CONV_OUT_CE=>CREATE(编码 = '4103')。"4103 = utf-16le

    然后对字符串进行编码并检索编码的字节:

    转换->重置()。

    转换->写入(数据 = `ABCDE`)。

    xstring = conv->GET_BUFFER()。

    最终,在 6.40 中添加了该方法,而不是使用RESET, WRITEand并进行了改进:GET_BUFFERCONVERT

    转换->转换(导出数据 = `ABCDE` 导入缓冲区 = xstring)。

对于 class CL_ABAP_CONV_OUT_CE,您需要使用 SAP Code Page 的编号,而不是 ISO 名称。以下是最常见的 SAP 代码页及其等效的 ISO 名称:

  • 1100:ISO-8859-1
  • 1101:美国 ASCII
  • 1160:Windows-1252(“ANSI”)
  • 1401:ISO-8859-2
  • 4102:UTF-16BE
  • 4103:UTF-16LE
  • 4104:UTF-32BE
  • 4105:UTF-32LE
  • 4110:UTF-8
  • 等等(可能的值在 table 中定义,TCP00A与 column 一致CPATTRKIND = 'H')。

 

  1. 在给定代码页中的应用程序服务器上写入文件

在 ABAP 中,OPEN DATASET可以直接指定目标代码页,支持大多数代码页,包括UTF-8,但不支持其他UTF(代码页 41xx),只能通过下面 2.3 中解释的解决方案(通过在内存中进行第一次编码)来完成。

  • 2.1)IN TEXT MODE ENCODING ...

可能的ENCODING值:

  • UTF-8:在这种模式下,如果需要,可以通过选项添加字节顺序标记WITH BYTE-ORDER MARK
  • DEFAULT: 在 SAP "Unicode" 系统中将是 UTF-8(您可以通过菜单 System > Status > Unicode System Yes/No 检查),否则为 NON-UNICODE。
  • NON-UNICODE:将取决于当前的ABAP语言环境;对于语言英语,它是字符编码iso-8859-1,对于语言波兰语,它是字符编码iso-8859-2等(等价物见表TCP0C。)

UTF-8ABAP 版本 7.52 中使用字节顺序标记写入的示例:

REPORT zmyprogram.
DATA(filename) = `/tmp/dataset_utf_8`.
OPEN DATASET filename IN TEXT MODE ENCODING UTF-8 WITH BYTE-ORDER MARK FOR OUTPUT.
TRY.
    TRANSFER `Witaj świecie` TO filename.
  CATCH cx_sy_conversion_codepage INTO DATA(lx).
    " Character not supported in language code page
ENDTRY.
CLOSE DATASET filename.

ABAP 7.52 版中要写入的示例iso-8859-2(此处为波兰语):

REPORT zmyprogram.
SET LOCALE LANGUAGE 'L'. " Polish
DATA(filename) = `/tmp/dataset_nonunicode_pl`.
OPEN DATASET filename IN TEXT MODE ENCODING NON-UNICODE FOR OUTPUT.
TRY.
    TRANSFER `Witaj świecie` TO filename.
  CATCH cx_sy_conversion_codepage INTO DATA(lx).
    " Character not supported in language code page
ENDTRY.
CLOSE DATASET filename.
  • 2.2)IN LEGACY TEXT MODE CODE PAGE ...

使用除代码页 41xx 之外的任何代码页号(即UTF-8和其他UTF;参见下面 2.3 中的解决方法)。

ABAP 7.52 版中要写入的示例iso-8859-2(代码页 1401):

REPORT zmyprogram.
DATA(filename) = `/tmp/dataset_iso_8859_2`.

OPEN DATASET filename IN LEGACY TEXT MODE CODE PAGE '1401' FOR OUTPUT. " iso-8859-2
TRY.
    TRANSFER `Witaj świecie` TO filename.
  CATCH cx_sy_conversion_codepage INTO DATA(lx).
    " Character not supported in language code page
ENDTRY.
CLOSE DATASET filename.
  • 2.3)UTF = general way + IN BINARY MODE

ABAP 版本 7.52 中的示例:

REPORT zmyprogram.
TRY.
    DATA(xstring) = cl_abap_codepage=>convert_to( source = `Witaj świecie` codepage = `UTF-16LE` ).
  CATCH cx_sy_conversion_codepage INTO DATA(lx).
    " Character not supported in language code page
    BREAK-POINT.
ENDTRY.
DATA(filename) = `/tmp/dataset_utf_16le`.
OPEN DATASET filename IN BINARY MODE FOR OUTPUT.
TRANSFER xstring TO filename.
CLOSE DATASET filename.
于 2020-02-09T04:20:38.063 回答