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

问题描述 投票:0回答: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.

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

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

character-encoding sap abap codepages character-set
1个回答
0
投票

在第一部分中,我解释了如何将字符串字符串编码到给定的代码页中(所有操作都在内存中完成),在第二部分中,我特别说明了如何以给定的代码将文件写入应用程序服务器页面。

  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_CONV_CODEPAGE

    DATA xstring TYPE xstring。

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

  • 在7.02之前,使用类CL_ABAP_CODEPAGE(该类随附的文档):

    首先,实例化转换对象,使用SAP代码页号代替ISO名称(以下显示的值列表):

    数据:转换类型引用为CL_ABAP_CONV_OUT_CE,xstring类型为xstring。

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

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

    转换-> RESET()。

    conv-> WRITE(data =`ABCDE`)。

    xstring =转换-> GET_BUFFER()。

    最终,而不是使用CL_ABAP_CODEPAGECL_ABAP_CONV_OUT_CERESET,而是在6.40中添加了方法WRITE并进行了移植:

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

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

  • 1100:ISO-8859-1
  • 1101:US-ASCII
  • 1160:Windows-1252(“ ANSI”)
  • 1401:ISO-8859-2
  • 4102:UTF-16BE
  • 4103:UTF-16LE
  • 4104:UTF-32BE
  • 4105:UTF-32LE
  • 4110:UTF-8
  • 等等(可能的值在表CONVERT中的第CL_ABAP_CONV_OUT_CE列中定义)。

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

[在ABAP中,TCP00A可以直接指定目标代码页,支持大多数代码页,包括CPATTRKIND = 'H',但不支持其他OPEN DATASET(代码页41xx),只能通过下面的2.3中说明的解决方案来完成(通过先在内存中编码)。

  • 2.1)OPEN DATASET

可能的UTF-8值:

  • UTF:在此模式下,可以根据需要通过选项IN TEXT MODE ENCODING ...添加字节顺序标记。
  • [ENCODING:在SAP“ Unicode”系统中为UTF-8(可通过菜单系统>状态> Unicode系统是/否来检查,否则为NON-UNICODE。
  • UTF-8:将取决于当前的ABAP语言环境;对于英语,它是字符编码WITH BYTE-ORDER MARK,对于波兰语,它是字符编码DEFAULT,依此类推。(等价性在表NON-UNICODE中显示。)

ABAP版本7.52中以字节顺序标记写入iso-8859-1的示例:

iso-8859-2

[ABAP版本7.52中的示例,它写入TCP0C(此处为波兰语:):

UTF-8
  • 2.2)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.

使用除代码页41xx以外的任何代码页号(即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.3中的解决方法)。

[ABAP版本7.52中写入IN LEGACY TEXT MODE CODE PAGE ...的示例(代码页1401):

UTF-8
  • 2.3)UTF

ABAP版本7.52中的示例:

iso-8859-2
最新问题
© www.soinside.com 2019 - 2024. All rights reserved.