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)
我想一种解决方案是首先在内存中对字符串进行编码,然后将编码后的字节写入文件。
一般来说,如何将一串字符编码到内存中给定的代码页中?
在第一部分中,我解释了如何将字符串编码为给定的代码页(全部在内存中完成),在第二部分中,我具体解释了如何在给定的代码页中将文件写入应用程序服务器。
\n如果必须对字符串(类型STRING
)进行编码,则结果必须存储在字节字符串中,这对应于内置数据类型XSTRING
。
有几种可能性取决于 ABAP 版本:
\n从 7.53 开始,使用该类CL_ABAP_CONV_CODEPAGE
:
\n\nDATA(xstring) = cl_abap_conv_codepage=>create_out( codepage = `UTF-16LE` )->convert( source = `ABCDE` )。
\n
从 7.02 开始,使用该类CL_ABAP_CODEPAGE
:
\n\n数据 xstring 类型 xstring。
\n
\n\nxstring = cl_abap_codepage=>convert_to( 源 = `ABCDE` 代码页 = `UTF-16LE` )。
\n
在7.02之前,使用类CL_ABAP_CONV_OUT_CE
(随类提供的文档):
首先,实例化转换对象,使用 SAP 代码页号而不是 ISO 名称(值列表如下所示):
\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\nxstring = 转换->GET_BUFFER( )。
\n
最终,该方法不再使用RESET
, WRITE
and ,而是在 6.40 中添加并重新移植:GET_BUFFER
CONVERT
\n\nconv->CONVERT( 导出数据 = `ABCDE` 导入缓冲区 = xstring )。
\n
对于 class CL_ABAP_CONV_OUT_CE
,您需要使用 SAP 代码页的编号,而不是 ISO 名称。以下是最常见的 SAP 代码页及其等效的 ISO 名称:
TCP00A
,与列一致CPATTRKIND = \'H\'
)。\xc2\xa0
\n在ABAP中,OPEN DATASET
可以直接指定目标代码页,大多数代码页都支持,包括UTF-8
,但不支持其他UTF
代码页(代码页41xx),这只能通过下面2.3中解释的解决方案来完成(通过首先在内存中编码)。
IN TEXT MODE ENCODING ...
可能的ENCODING
值:
UTF-8
:在此模式下,如果需要,可以通过选项添加字节顺序标记WITH BYTE-ORDER MARK
。DEFAULT
:在 SAP“Unicode”系统中将是 UTF-8(您可以通过菜单系统 > 状态 > Unicode 系统是/否进行检查),否则为非 UNICODE。NON-UNICODE
:取决于当前ABAP语言环境;对于英语语言,它是字符编码iso-8859-1
,对于波兰语语言,它是字符编码iso-8859-2
,等等(等效项如表所示TCP0C
。)UTF-8
ABAP 版本 7.52 中使用字节顺序标记写入的示例:
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)\nABAP 版本 7.52 中的写入示例iso-8859-2
(此处为波兰语):
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)\nIN LEGACY TEXT MODE CODE PAGE ...
使用除代码页 41xx 之外的任何代码页号(即UTF-8
和其他UTF
;请参阅下面 2.3 中的解决方法)。
ABAP 版本 7.52 中要写入的示例iso-8859-2
(代码页 1401):
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)\nUTF = general way + IN BINARY MODE
ABAP 版本 7.52 中的示例:
\nREPORT 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