如何将 STRING 变量编码到给定的代码页中

San*_*ssi 1 abap character-encoding codepages character-set

我有一个字符串变量,其中包含我需要在代码页中编码并写入文件的文本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.
Run Code Online (Sandbox Code Playgroud)

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

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

San*_*ssi 6

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

\n
    \n
  1. 通用方式(全部在内存中)
  2. \n
\n

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

\n

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

\n
    \n
  • 从 7.53 开始,使用该类CL_ABAP_CONV_CODEPAGE

    \n
    \n

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

    \n
    \n
  • \n
  • 从 7.02 开始,使用该类CL_ABAP_CODEPAGE

    \n
  • \n
\n
\n

数据 xstring 类型 xstring。

\n
\n
\n

xstring = cl_abap_codepage=>convert_to( 源 = `ABCDE` 代码页 = `UTF-16LE` )。

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

    \n

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

    \n
  • \n
\n
\n

数据:转换类型参考 CL_ABAP_CONV_OUT_CE,xstring 类型 xstring。

\n
\n
\n

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

\n
\n

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

\n
\n

转换->重置()。

\n
\n
\n

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

\n
\n
\n

xstring = 转换->GET_BUFFER( )。

\n
\n

最终,该方法不再使用RESET, WRITEand ,而是在 6.40 中添加并重新移植:GET_BUFFERCONVERT

\n
\n

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

\n
\n

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

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

\xc2\xa0

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

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

\n
    \n
  • 2.1)IN TEXT MODE ENCODING ...
  • \n
\n

可能的ENCODING值:

\n
    \n
  • UTF-8:在此模式下,如果需要,可以通过选项添加字节顺序标记WITH BYTE-ORDER MARK
  • \n
  • DEFAULT:在 SAP“Unicode”系统中将是 UTF-8(您可以通过菜单系统 > 状态 > Unicode 系统是/否进行检查),否则为非 UNICODE。
  • \n
  • NON-UNICODE:取决于当前ABAP语言环境;对于英语语言,它是字符编码iso-8859-1,对于波兰语语言,它是字符编码iso-8859-2,等等(等效项如表所示TCP0C。)
  • \n
\n

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

\n
REPORT zmyprogram.\nDATA(filename) = `/tmp/dataset_utf_8`.\nOPEN DATASET filename IN TEXT MODE ENCODING UTF-8 WITH BYTE-ORDER MARK FOR OUTPUT.\nTRY.\n    TRANSFER `Witaj \xc5\x9bwiecie` TO filename.\n  CATCH cx_sy_conversion_codepage INTO DATA(lx).\n    " Character not supported in language code page\nENDTRY.\nCLOSE DATASET filename.\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n
REPORT zmyprogram.\nSET LOCALE LANGUAGE \'L\'. " Polish\nDATA(filename) = `/tmp/dataset_nonunicode_pl`.\nOPEN DATASET filename IN TEXT MODE ENCODING NON-UNICODE FOR OUTPUT.\nTRY.\n    TRANSFER `Witaj \xc5\x9bwiecie` TO filename.\n  CATCH cx_sy_conversion_codepage INTO DATA(lx).\n    " Character not supported in language code page\nENDTRY.\nCLOSE DATASET filename.\n
Run Code Online (Sandbox Code Playgroud)\n
    \n
  • 2.2)IN LEGACY TEXT MODE CODE PAGE ...
  • \n
\n

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

\n

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

\n
REPORT zmyprogram.\nDATA(filename) = `/tmp/dataset_iso_8859_2`.\n\nOPEN DATASET filename IN LEGACY TEXT MODE CODE PAGE \'1401\' FOR OUTPUT. " iso-8859-2\nTRY.\n    TRANSFER `Witaj \xc5\x9bwiecie` TO filename.\n  CATCH cx_sy_conversion_codepage INTO DATA(lx).\n    " Character not supported in language code page\nENDTRY.\nCLOSE DATASET filename.\n
Run Code Online (Sandbox Code Playgroud)\n
    \n
  • 2.3)UTF = general way + IN BINARY MODE
  • \n
\n

ABAP 版本 7.52 中的示例:

\n
REPORT zmyprogram.\nTRY.\n    DATA(xstring) = cl_abap_codepage=>convert_to( source = `Witaj \xc5\x9bwiecie` codepage = `UTF-16LE` ).\n  CATCH cx_sy_conversion_codepage INTO DATA(lx).\n    " Character not supported in language code page\n    BREAK-POINT.\nENDTRY.\nDATA(filename) = `/tmp/dataset_utf_16le`.\nOPEN DATASET filename IN BINARY MODE FOR OUTPUT.\nTRANSFER xstring TO filename.\nCLOSE DATASET filename.\n
Run Code Online (Sandbox Code Playgroud)\n