Data is passed to a string field while reading Read dataset. here i can't use xstring. so i don't need do step 2 in this case.
No, en realidad debes usar xstring , porque debes abrir el archivo en modo binario (según la documentación de SAP que cité anteriormente, esa es la única forma de leer un archivo codificado en UTF-16. A continuación, te muestro una versión corta que intentaría como inicio (nunca la he probado, por lo que es posible que necesites hacer algunos ajustes):
DATA:
file TYPE string,
data TYPE xstring,
file_content TYPE xstring,
conv_in TYPE REF TO cl_abap_conv_in_ce,
xml_string TYPE string.
* Leer el archivo UTF-16 como archivo binario
OPEN DATASET file FOR INPUT IN BINARY MODE.
DO.
READ DATASET file INTO data.
IF sy-subrc = 0.
CONCATENATE file_content data INTO file_content IN BYTE MODE.
ELSE.
EXIT.
ENDIF.
ENDDO.
CLOSE DATASET file.
* Convertir la cadena hexadecimal file_content con datos de archivo en cadena
conv_in = cl_abap_conv_in_ce=>create(
encoding = 'UTF-16'
* endian = ' ' " el valor predeterminado debería estar bien
input = file_content ).
conv_in->read( IMPORTING data = xml_string ).
REPLACE FIRST OCCURRENCE OF SUBSTRING 'UTF-16' IN xml_string
WITH 'UTF-8' IGNORING CASE.
* Escribir nuevo archivo usando codificación UTF-8
CONCATENATE 'utf8_' file
Respondido el 15/04/2024
LUCIANO RIOJA GHIOTTO
Se unió el 13/07/2019
Hola Herald,
Los datos se pasan a un campo de cadena mientras se lee el conjunto de datos Read. Aquí no puedo usar xstring.
así que no necesito hacer el paso 2 en este caso.
¿En el paso 3, me estás diciendo que reemplace UTF-16 con UTF-8 en la cadena xml? ¿Es esto correcto?
Gracias de antemano.
Hhmm, interesante. Pensé que debería ser sencillo, pero las dos soluciones que se me ocurrieron parecen un poco complicadas. La primera forma probablemente sea usar la biblioteca iXML , donde el punto de partida es la clase CL_IXML . Puedes encontrar la documentación de SAP [aquí|http://help.sap.com/saphelp_nw04/helpdata/en/86/8280d212d511d5991b00508b6b8b11/frameset.htm].
Luego está un enfoque "manual": Usar OPEN DATASET para leer el archivo UTF-16, luego modificar el atributo de codificación XML y guardarlo como archivo UTF-8. No es sencillo, porque la tentadora opción de comando [OPEN DATASET .. LEGACY TEXT MODE CODE PAGE|http://help.sap.com/abapdocu_70/en/ABAPOPEN_DATASET_MODE.htm] no funciona. Según la ayuda de ABAP:
Para la especificación de la página de códigos cp, se espera un objeto de datos de tipo carácter que debe contener - en el momento de la ejecución de la sentencia - la etiqueta de una página no Unicode desde la columna CPCODEPAGE en la tabla de base de datos TCP00. Una página Unicode no debe ser especificada.
Vaya, parece que esperan que la mayoría de los archivos Unicode sean UTF-8. Pero esa podría ser la razón por la que quieres convertirlo...
Así que sigue los siguientes pasos:
<ol><li>Abre el archivo como un archivo binario (la única opción para UTF-16, ver [aquí|http://help.sap.com/abapdocu_70/en/ABAPOPEN_DATASET_ENCODING.htm]) a través de [OPEN DATASET file FOR INPUT IN BINARY MODE|http://help.sap.com/abapdocu_70/en/ABAPOPEN_DATASET.htm] y lee el contenido en XSTRING usando [READ DATASET|http://help.sap.com/abapdocu_70/en/ABAPREAD_DATASET.htm].</li>
<li>Conviértelo a una cadena usando la clase de utilidad [CL_ABAP_CONV_IN_CE|http://help.sap.com/saphelp_nw04/helpdata/en/79/c554afb3dc11d5993800508b6b8b11/frameset.htm], ver ejemplo [aquí|http://wiki.sdn.sap.com/wiki/display/Snippets/ABAP Code Page+Conversions].</li>
<li>Reemplaza la marca de codificación para UTF-16 en el XML con una referencia a UTF-8.</li>
<li>Escribe el contenido XML de nuevo en un archivo usando [OPEN DATASET file|http://help.sap.com/abapdocu_70/en/ABAPOPEN_DATASET.htm] FOR [OUTPUT|http://help.sap.com/abapdocu_70/en/ABAPOPEN_DATASET_ACCESS.htm] IN [TEXT MODE|http://help.sap.com/abapdocu_70/en/ABAPOPEN_DATASET_MODE.htm] [ENCODING UTF-8|http://help.sap.com/abapdocu_70/en/ABAPOPEN_DATASET_ENCODING.htm] y [TRANSFER|http://help.sap.com/abapdocu_70/en/ABAPTRANSFER.htm]</li></ol>
Tal vez alguien tenga una forma más corta...
Saludos, harald
Hhmm, interesante. Pensé que debería ser sencillo, pero las dos soluciones que se me ocurrieron parecen un poco complicadas. La primera forma probablemente sea usar la biblioteca iXML , donde el punto de partida es la clase CL_IXML . Puedes encontrar la documentación de SAP [aquí|http://help.sap.com/saphelp_nw04/helpdata/en/86/8280d212d511d5991b00508b6b8b11/frameset.htm].
Luego está un "enfoque manual": Usar OPEN DATASET para leer el archivo UTF-16, luego modificar el atributo de codificación XML y guardarlo como archivo UTF-8. No es sencillo, porque la tentadora opción de comando [OPEN DATASET .. LEGACY TEXT MODE CODE PAGE|http://help.sap.com/abapdocu_70/en/ABAPOPEN_DATASET_MODE.htm] no funciona. Según la ayuda de ABAP:
Para la especificación de la página de códigos cp, se espera un objeto de datos de tipo carácter que debe contener - en el momento de la ejecución de la declaración - la etiqueta de una página no Unicode de la columna CPCODEPAGE en la tabla de base de datos TCP00. Una página Unicode no debe ser especificada.
Vaya, parece que esperan que la mayoría de los archivos Unicode sean UTF-8. Pero esa podría ser la razón por la que quieres convertirlo...
Así que sigue los siguientes pasos:
<ol><li>Abre el archivo como un archivo binario (la única opción para UTF-16, ver [aquí|http://help.sap.com/abapdocu_70/en/ABAPOPEN_DATASET_ENCODING.htm]) a través de [OPEN DATASET file FOR INPUT IN BINARY MODE|http://help.sap.com/abapdocu_70/en/ABAPOPEN_DATASET.htm] y lee el contenido en XSTRING usando [READ DATASET|http://help.sap.com/abapdocu_70/en/ABAPREAD_DATASET.htm].</li>
<li>Conviértelo a una cadena usando la clase de utilidad [CL_ABAP_CONV_IN_CE|http://help.sap.com/saphelp_nw04/helpdata/en/79/c554afb3dc11d5993800508b6b8b11/frameset.htm], ver ejemplo [aquí|http://wiki.sdn.sap.com/wiki/display/Snippets/ABAP Code Page+Conversions].</li>
<li>Reemplaza la marca de codificación para UTF-16 en el XML con una referencia a UTF-8.</li>
<li>Escribe el contenido XML de nuevo en un archivo usando [OPEN DATASET file|http://help.sap.com/abapdocu_70/en/ABAPOPEN_DATASET.htm] FOR [OUTPUT|http://help.sap.com/abapdocu_70/en/ABAPOPEN_DATASET_ACCESS.htm] IN [TEXT MODE|http://help.sap.com/abapdocu_70/en/ABAPOPEN_DATASET_MODE.htm] [ENCODING UTF-8|http://help.sap.com/abapdocu_70/en/ABAPOPEN_DATASET_ENCODING.htm] y [TRANSFER|http://help.sap.com/abapdocu_70/en/ABAPTRANSFER.htm]</li></ol>
Tal vez alguien tenga una forma más corta...
Saludos, harald