[在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.
我想一种解决方案是先在内存中对字符串进行编码,然后将编码后的字节写入文件。
一般来说,如何在内存中将字符串编码为给定的代码页?
在第一部分中,我解释了如何将字符串字符串编码到给定的代码页中(所有操作都在内存中完成),在第二部分中,我特别说明了如何以给定的代码将文件写入应用程序服务器页面。
如果必须对字符串(类型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_CODEPAGE
,CL_ABAP_CONV_OUT_CE
和RESET
,而是在6.40中添加了方法WRITE
并进行了移植:
conv-> CONVERT(导出数据=`ABCDE`导入缓冲区= xstring)。
对于类GET_BUFFER
,您需要使用SAP代码页的编号,而不是ISO名称。这是最常见的SAP代码页及其等效的ISO名称:
CONVERT
中的第CL_ABAP_CONV_OUT_CE
列中定义)。[在ABAP中,TCP00A
可以直接指定目标代码页,支持大多数代码页,包括CPATTRKIND = 'H'
,但不支持其他OPEN DATASET
(代码页41xx),只能通过下面的2.3中说明的解决方案来完成(通过先在内存中编码)。
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
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
UTF
ABAP版本7.52中的示例:
iso-8859-2