Как закодировать переменную STRING в заданную кодовую страницу - PullRequest
2 голосов
/ 09 февраля 2020

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

2 голосов
/ 09 февраля 2020

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

  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:

    DATA xstring TYPE xstring.

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

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

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

    ДАННЫЕ: conv ТИП ОТНОСИТЕЛЬНО CL_ABAP_CONV_OUT_CE, xstring TYPE xstring.

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

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

    conv-> RESET ().

    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 необходимо использовать номер кодовой страницы 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
  • Et c. (Возможные значения определены в таблице TCP00A, в строках со столбцом 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: будет UTF-8 в системе SAP "Юникод" (которую можно проверить через меню Система> Статус> Система Юникод Да / Нет), в противном случае - НЕ ЮНИКОД .
  • NON-UNICODE: будет зависеть от текущей среды ABAP linguisti c; для языка Engli sh это кодировка символов iso-8859-1, для языка Poli sh это кодировка символов iso-8859-2, et c. (эквивалентности показаны в таблице 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 (язык * Poli sh здесь):

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.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...