Character encoding 如何将字符串变量编码到给定的代码页中

Character encoding 如何将字符串变量编码到给定的代码页中,character-encoding,abap,codepages,character-set,Character Encoding,Abap,Codepages,Character Set,在UTF-16LE代码页中,我有一个字符串变量,其中包含一个需要编码并写入文件的文本 目前,下面的代码生成一个UTF-8文件,我在OpenDataSet语句中看不到任何选项来生成UTF-16LE中的文件 我想一个解决方案是首先在内存中对字符串进行编码,然后将编码的字节写入文件 一般来说,如何在内存中将字符串编码到给定的代码页中?在第一部分中,我将解释如何将字符串编码到给定的代码页中所有操作都在内存中完成,在第二部分中,我将具体解释如何在给定的代码页中将文件写入应用程序服务器 通用方式全部在内存中

在UTF-16LE代码页中,我有一个字符串变量,其中包含一个需要编码并写入文件的文本

目前,下面的代码生成一个UTF-8文件,我在OpenDataSet语句中看不到任何选项来生成UTF-16LE中的文件

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


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

在第一部分中,我将解释如何将字符串编码到给定的代码页中所有操作都在内存中完成,在第二部分中,我将具体解释如何在给定的代码页中将文件写入应用程序服务器

通用方式全部在内存中 如果必须对字符串类型的字符串进行编码,则结果必须存储在字节字符串中,这与内置数据类型XSTRING相对应

有几种可能性取决于ABAP版本;我使用:

从7.53开始,使用以下类别:

DATAxstring=cl\u abap\u conv\u codepage=>create\u out codepage=`UTF-16LE`->convert source=`ABCDE`

从7.02开始,使用以下类:

数据xstring类型xstring

xstring=cl\u abap\u代码页=>convert\u to source=`ABCDE`codepage=`UTF-16LE`

7.02之前,请使用随课程提供的课程内容文档:

首先,实例化转换对象,使用SAP代码页码,而不是下面显示的ISO名称值列表:

数据:conv TYPE REF TO CL_ABAP_conv_OUT_CE,xstring TYPE xstring

conv=CL\u ABAP\u conv\u OUT\u CE=>CREATE encoding='4103'。4103=utf-16le

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

转换->重置

conv->WRITE data=`ABCDE`

xstring=conv->获取缓冲区

最终,在6.40中添加了方法CONVERT,并对其进行了重新报告,而不是使用RESET、WRITE和GET_BUFFER:

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

对于CL_ABAP_CONV_OUT_CE类,您需要使用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 表TCP00A中定义了可能的值,与列CPATTRKIND='H'对齐。 在给定的代码页中在应用程序服务器上写入文件 在ABAP中,可以直接指定目标代码页,支持大多数代码页,包括UTF-8,但不支持其他UTF代码页41xx,这只能通过以下2.3中解释的解决方案在内存中进行首次编码来完成

2.1在文本模式编码中。。。 可能的编码值:

UTF-8:在这种模式下,如果需要,可以通过带有字节顺序标记的选项添加字节顺序标记。 默认值:在SAP Unicode系统中为UTF-8,您可以通过菜单“系统>状态>Unicode系统是/否”进行检查,否则为非Unicode。 非UNICODE:取决于当前的ABAP语言环境;对于语言英语,它是字符编码iso-8859-1,对于语言波兰语,它是字符编码iso-8859-2,等等。等效值如表TCP0C所示。 ABAP版本7.52中使用字节顺序标记写入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.
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在传统文本模式代码页中。。。 使用除代码页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=二进制模式下的常规方式 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.

在第一部分中,我将解释如何将字符串编码到给定的代码页中—所有操作都在内存中完成,在第二部分中,我将具体解释如何在给定的代码页中将文件写入应用程序服务器

通用方式全部在内存中 如果必须对字符串类型的字符串进行编码,则结果必须存储在字节字符串中,这与内置数据类型XSTRING相对应

有几种可能性取决于ABAP版本;我使用:

从7.53开始,使用以下类别:

DATAxstring=cl\u abap\u conv\u codepage=>create\u out codepage=`UTF-16LE`->convert source=`ABCDE`

从7.02开始,使用以下类:

数据xstring类型xstring

xstring=cl\u abap\u代码页=>convert\u to source=`ABCDE`codepage=`UTF-16LE`

7.02之前,请使用随课程提供的课程内容文档:

首先,实例化转换对象,使用SAP代码页码,而不是下面显示的ISO名称值列表:

数据:conv TYPE REF TO CL_ABAP_conv_OUT_CE,xstring TYPE xstring

conv=CL\u ABAP\u conv\u OUT\u CE=>CREATE encoding='4103 ' . 4103=utf-16le

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

转换->重置

conv->WRITE data=`ABCDE`

xstring=conv->获取缓冲区

最终,在6.40中添加了方法CONVERT,并对其进行了重新报告,而不是使用RESET、WRITE和GET_BUFFER:

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

对于CL_ABAP_CONV_OUT_CE类,您需要使用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 表TCP00A中定义了可能的值,与列CPATTRKIND='H'对齐。 在给定的代码页中在应用程序服务器上写入文件 在ABAP中,可以直接指定目标代码页,支持大多数代码页,包括UTF-8,但不支持其他UTF代码页41xx,这只能通过以下2.3中解释的解决方案在内存中进行首次编码来完成

2.1在文本模式编码中。。。 可能的编码值:

UTF-8:在这种模式下,如果需要,可以通过带有字节顺序标记的选项添加字节顺序标记。 默认值:在SAP Unicode系统中为UTF-8,您可以通过菜单“系统>状态>Unicode系统是/否”进行检查,否则为非Unicode。 非UNICODE:取决于当前的ABAP语言环境;对于语言英语,它是字符编码iso-8859-1,对于语言波兰语,它是字符编码iso-8859-2,等等。等效值如表TCP0C所示。 ABAP版本7.52中使用字节顺序标记写入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.
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在传统文本模式代码页中。。。 使用除代码页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=二进制模式下的常规方式 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.

很好的解释,桑德拉!似乎您有意为常见任务创建基于主题的SAP wiki页面:请使用除代码页41xx之外的任何代码页编号,顺便问一下,您从何处发现哪些代码页支持传统文本模式,哪些不支持?我在Help中没有看到任何信息是的,Stack Overflow鼓励创建自答问题,因为这将有利于其他人。好的是,任何人都可以参与、纠正或改进。是的,这是有意为之的,目前还处于实验阶段,我正在GitHub存储库中处理一个Q&a索引,不确定确切的格式应该是什么。代码页cp需要一个类似字符的数据对象,在执行语句时,必须包含数据库表TCP00中CPCODEPAGE列中非Unicode页面的名称。无法指定Unicode代码页。非常好的解释,Sandra!似乎您有意为常见任务创建基于主题的SAP wiki页面:请使用除代码页41xx之外的任何代码页编号,顺便问一下,您从何处发现哪些代码页支持传统文本模式,哪些不支持?我在Help中没有看到任何信息是的,Stack Overflow鼓励创建自答问题,因为这将有利于其他人。好的是,任何人都可以参与、纠正或改进。是的,这是有意为之的,目前还处于实验阶段,我正在GitHub存储库中处理一个Q&a索引,不确定确切的格式应该是什么。代码页cp需要一个类似字符的数据对象,在执行语句时,必须包含数据库表TCP00中CPCODEPAGE列中非Unicode页面的名称。无法指定Unicode代码页。