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.