Как закодировать переменную STRING в заданную кодовую страницу

У меня есть строковая переменная, содержащая текст, который мне нужно кодировать и записать в файл, в кодовой странице 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.

Я думаю, что одно из решений - сначала закодировать строку в памяти, а затем записать закодированные байты в файл.

Вообще говоря, как закодировать строку символов в заданную кодовую страницу в памяти?

Всего 1 ответ


В первой части я объясняю, как кодировать строку символов в заданную кодовую страницу (все выполняется в памяти), а во второй части я объясняю, в частности, как записывать файлы на сервер приложений в заданной кодовой странице.

  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_CODEPAGE :

    ДАННЫЕ xstring ТИП xstring.

    xstring = cl_abap_codepage => convert_to (source = `ABCDE` codepage =` UTF-16LE`).

  • До 7.02 используйте класс CL_ABAP_CONV_OUT_CE (документация, предоставляемая вместе с классом):

    Сначала создайте экземпляр объекта преобразования, используйте номер кодовой страницы SAP вместо имени ISO (список значений показан ниже):

    DATA: conv TYPE REF TO CL_ABAP_CONV_OUT_CE, xstring TYPE xstring.

    conv = CL_ABAP_CONV_OUT_CE => CREATE (кодировка = '4103'). "4103 = utf-16le

    Затем закодируйте строку и получите закодированные байты:

    Конв-> СБРОС ().

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

    xstring = conv-> GET_BUFFER ().

    В конце концов, вместо использования RESET , WRITE и GET_BUFFER , метод CONVERT был добавлен в 6.40 и ретропортирован:

    conv-> CONVERT (EXPORTING data = `ABCDE` IMPORTING buffer = xstring).

Для класса CL_ABAP_CONV_OUT_CE необходимо использовать номер 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' ).

  1. Запись файла на сервере приложений в заданной кодовой странице

В ABAP OPEN DATASET может напрямую указывать целевую кодовую страницу, поддерживается большинство кодовых страниц, включая UTF-8 , но не другие UTF (кодовые страницы 41xx), что может быть выполнено только решением, описанным в п. 2.3 ниже (с помощью первой кодировки в памяти). ).

  • 2.1) IN TEXT MODE ENCODING ...

Возможные значения ENCODING :

  • UTF-8 : в этом режиме можно добавить метку порядка байтов, если это необходимо, с помощью параметра WITH BYTE-ORDER MARK .
  • DEFAULT : будет UTF-8 в системе SAP "Юникод" (которую можно проверить через меню Система> Статус> Система Юникод Да / Нет), в противном случае - НЕ ЮНИКОД.
  • NON-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) 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 񟣩' 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.

Есть идеи?

10000