¡Caminando hacia el éxito!

Aprende en Comunidad

Avalados por :

Problemas de conversión de caracteres al descargar archivos en UTF-16 Little Endian en SAP

  • Creado 01/03/2024
  • Modificado 01/03/2024
  • 96 Vistas
0
Cargando...

Hola Abappers,

Tengo un requisito para descargar archivos en UTF-16 Little Endian.

Puedo hacerlo con la siguiente declaración:

OPEN DATASET l_file FOR APPENDING IN LEGACY BINARY MODE LITTLE ENDIAN TYPE 'NT'.

IF sy-subrc EQ 0.

LOOP AT data_tab INTO wa_data.

TRANSFER wa_data-line TO l_file.

ENDLOOP.

ELSE.

RAISE EXCEPTION TYPE zcx_migratie (clase de excepción personalizada)

EXPORTING

textid = zcx_migratie=>download_error

file   = file.

ENDIF.

CLOSE DATASET l_file.

Sin embargo, si hay un signo de euro en el archivo, recibo un dump CONVT_CODEPAGE que indica:

"No es posible una conversión de conjunto de caracteres,

En la conversión de un texto desde la página de códigos '4103' a la página de códigos '1100': "

¿De dónde proviene la página de códigos 1100? ¿Alguna idea. ¿Por qué SAP intenta convertir 4103 a 1100 cuando SAP es un sistema unicode que utiliza CP 4103 (= UTF-16) y el archivo de destino también es UTF-16?

Los datos que estoy intentando descargar provienen de la base de datos y los campos se han concatenado en una cadena por línea separada por punto y coma (;) y se han agregado a una tabla de cadenas. Antes de la descarga, puedo ver el signo de euro en la cadena.

Definición de la tabla a descargar:

TYPES:

BEGIN OF ty_data,

line             TYPE string,

END OF ty_data .

TYPES:

tt_data TYPE STANDARD TABLE OF ty_data .

DATA: data_tab TYPE tt_data,

l_file   TYPE string,

wa_data  TYPE ty_data.

Si verifico mi sistema con FM SCP_GET_CODEPAGE_NUMBER, todo tiene la página de códigos 4103 excepto la página de códigos de la GUI que es 4110. El servidor es Windows.

También he intentado con las clases convertidoras de la siguiente manera:

TRY.

CALL METHOD cl_abap_conv_out_ce=>create

EXPORTING

encoding = 'UTF-16'

endian   = 'L'

RECEIVING

conv     = converter.

CALL METHOD converter->write

EXPORTING

data = string_sap.  (string_sap contiene solo una línea de la tabla de datos anterior, la línea con el signo de euro)

*         obtener resultado

CALL METHOD converter->get_buffer

RECEIVING

buffer = outxstring.

CATCH cx_root.

* Tu manejo de errores

* Verifica si hay un error y si UTF-16 realmente funciona

ENDTRY.

y luego descargar con

OPEN DATASET l_file FOR OUTPUT IN BINARY MODE.

IF sy-subrc EQ 0.

TRANSFER p_outxstring TO l_file.

ELSE.

RAISE EXCEPTION TYPE zcx_migratie

EXPORTING

textid = zcx_migratie=>download_error

file   = file.

ENDIF.

CLOSE DATASET l_file.

Pero ahora estoy obteniendo el error de tiempo de ejecución CONVT_CODEPAGE_INIT que indica:

"La conversión de textos en la página de códigos '4103' a la página de códigos 'UTF-' no es

compatible aquí."

Cuando uso '4103' en lugar de UTF-16, no crea la marca de orden de bytes endian = 'L' (FF FE)

y al usar este método para archivos más grandes, la codificación de los archivos de destino misteriosamente ha sido cambiada a ANSI incluso cuando en la misma sesión se descargan tablas más pequeñas como UTF-16 (aunque sin la BOM como se mencionó anteriormente)

Ahora estoy completamente perdido.

Pedro Pascal
Se unió el 07/03/2018
Pinterest
Telegram
Linkedin
Whatsapp

4 Respuestas

0
Cargando...

Documentación ABAP OPEN DATASET sobre modo -> LEGADO ... PÁGINA DE CÓDIGO ... : "En un sistema Unicode, los caracteres del archivo se manejan de acuerdo con la página de código no Unicode que se asignaría al leer o escribir datos en un sistema no Unicode (según lo especificado en la entrada de la tabla de base de datos TCP0C en el entorno de texto actual)."

Respondido el 15/04/2024
LUCIANO RIOJA GHIOTTO
Se unió el 13/07/2019
0
Cargando...

Gracias Sandra, acabo de intentarlo yo mismo (concatenar manualmente la marca de orden de bytes).

En cuanto al uso de Legacy en la declaración de conjunto de datos abiertos, lo utilicé porque era la única forma en la que podía obtener un archivo de destino en UTF-16LE sin usar la clase convertidora. Normalmente no lo uso, pero como dije, solo con esta adición se escribió un archivo en UTF-16LE en el servidor de aplicaciones. Créeme, leí muy bien la documentación sobre OPEN DATASET. Dice

"Abrir un archivo heredado . La adición EN MODO BINARIO HEREDADO abre el archivo como un archivo binario, exactamente como en la adición EN MODO BINARIO , excepto que en este caso también se pueden especificar la orden de bytes y la página de códigos con las que se debe manejar el archivo.

Así que esa fue la razón y la ÚNICA forma en que pude descargar en UTF-16 con Little Endian (si no se usa la clase convertidora). Como dije, el resultado de esta declaración (solo en combinación con LEGACY) es un archivo en UTF-16 Little Endian, pero por alguna razón SAP internamente intenta convertir primero a la página de códigos 1100. Aún me pregunto por qué. ¿Podría ser un error de instalación de mi sistema SAP?

Respondido el 15/04/2024
LUCIANO RIOJA GHIOTTO
Se unió el 13/07/2019
0
Cargando...

¿De dónde viene el código de página 1100 ? ¿Alguna idea? ¿Por qué SAP intenta convertir 4103 a 1100 cuando SAP es un sistema unicode que utiliza CP 4103 (= UTF-16) y el archivo objetivo también es UTF-16 ?

Necesitas leer la documentación ABAP de OPEN DATASET. Aquí el culpable es EL MODO LEGADO. Nunca lo uso a menos que necesite convertir a un código de página preciso (excepto Unicode que es especial, ver abajo).


¿Alguien puede decirme cuál es la forma correcta de descargar un archivo UTF-16LE que contiene un signo de euro (parte del código de página UTF-16 !!) ?

La única forma de hacerlo es convertirlo tú mismo usando CL_ABAP_CODEPAGE o CL_ABAP_CONV_CE_OUT, luego agregar cl_abap_char_utilities=>BYTE_ORDER_MARK_LITTLE al principio y escribir el xstring en el dataset abierto EN MODO BINARIO (no uses LEGACY).

Respondido el 15/04/2024
LUCIANO RIOJA GHIOTTO
Se unió el 13/07/2019
0
Cargando...

¿De dónde viene el código de página 1100? ¿Alguna idea? ¿Por qué SAP intenta convertir 4103 a 1100 cuando SAP es un sistema unicode que utiliza CP 4103 (= UTF-16) y el archivo de destino también es UTF-16 ?

Necesitas leer la documentación de ABAP de OPEN DATASET. Aquí el culpable es el MODO LEGADO. Nunca lo uso a menos que necesite convertir a un código de página preciso (excepto Unicode que es especial, ver abajo).


¿Alguien puede decirme cuál es la manera correcta de descargar un archivo UTF-16LE que contiene un signo de euro (parte del código de página UTF-16!!) ?

La única forma de hacerlo es convertirlo tú mismo usando CL_ABAP_CODEPAGE o CL_ABAP_CONV_CE_OUT, luego agregar cl_abap_char_utilities=>BYTE_ORDER_MARK_LITTLE al principio y escribir el xstring en el dataset abierto EN MODO BINARIO (no uses LEGADO).

Respondido el 15/04/2024
LUCIANO RIOJA GHIOTTO
Se unió el 13/07/2019

contacto@primeinstitute.com

(+51) 1641 9379
(+57) 1489 6964

© 2024 Copyright. Todos los derechos reservados.

Desarrollado por Prime Institute

¡Hola! Soy Diana, asesora académica de Prime Institute, indícame en que curso estas interesado, saludos!
Hola ¿Puedo ayudarte?