在第一部分中,我解释了如何将字符串编码到给定的代码页中(全部在内存中完成),在第二部分中,我具体解释了如何在给定的代码页中将文件写入应用程序服务器。
- 一般方式(全在内存中)
如果必须对字符串(类型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
, WRITE
and并进行了改进:GET_BUFFER
CONVERT
转换->转换(导出数据 = `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'
)。
- 在给定代码页中的应用程序服务器上写入文件
在 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-8
ABAP 版本 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.