¡Caminando hacia el éxito!

Aprende en Comunidad

Avalados por :

Problemas de conversão de caracteres ao baixar arquivos em UTF-16 Little Endian no SAP

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

Olá Abappers,

Tenho um requisito para baixar arquivos em UTF-16 Little Endian.

Posso fazer isso com a seguinte declaração:

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 (classe de exceção personalizada)

EXPORTING

textid = zcx_migratie=>download_error

file   = file.

ENDIF.

CLOSE DATASET l_file.

No entanto, se houver um sinal de euro no arquivo, recebo um dump CONVT_CODEPAGE que indica:

"Não é possível uma conversão de conjunto de caracteres,

Na conversão de um texto da página de códigos '4103' para a página de códigos '1100': "

De onde vem a página de códigos 1100? Alguma ideia. Por que o SAP está tentando converter 4103 para 1100 quando o SAP é um sistema Unicode que usa CP 4103 (= UTF-16) e o arquivo de destino também é UTF-16?

Os dados que estou tentando baixar vêm do banco de dados e os campos foram concatenados em uma string por linha separada por ponto e vírgula (;) e adicionados a uma tabela de strings. Antes do download, consigo ver o sinal de euro na string.

Definição da tabela a ser baixada:

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.

Se eu verificar meu sistema com FM SCP_GET_CODEPAGE_NUMBER, tudo tem a página de códigos 4103, exceto a página de códigos da GUI que é 4110. O servidor é Windows.

Também tentei com as classes conversoras da seguinte forma:

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 contém apenas uma linha da tabela de dados acima, a linha com o sinal de euro)

*         obter resultado

CALL METHOD converter->get_buffer

RECEIVING

buffer = outxstring.

CATCH cx_root.

* Seu tratamento de erros

* Verifique se há um erro e se UTF-16 realmente funciona

ENDTRY.

e então baixar com

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.

Mas agora estou recebendo o erro de tempo de execução CONVT_CODEPAGE_INIT que indica:

"A conversão de textos na página de códigos '4103' para a página de códigos 'UTF-' não é

compatível aqui."

Quando uso '4103' em vez de UTF-16, não cria a marca de ordem de bytes endian = 'L' (FF FE)

e ao usar este método para arquivos maiores, a codificação dos arquivos de destino misteriosamente mudou para ANSI mesmo quando na mesma sessão são baixadas tabelas menores como UTF-16 (embora sem o BOM como mencionado anteriormente)

Agora estou completamente perdido.

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

4 Respuestas

0
Cargando...

Documentação ABAP OPEN DATASET sobre modo -> LEGADO ... PÁGINA DE CÓDIGO ... : "Em um sistema Unicode, os caracteres do arquivo são manipulados de acordo com a página de código não Unicode que seria atribuída ao ler ou gravar dados em um sistema não Unicode (conforme especificado na entrada da tabela de base de dados TCP0C no ambiente de texto atual)."

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

Obrigado Sandra, acabei de tentar fazer isso por conta própria (concatenar manualmente a marca de ordem de bytes).

Quanto ao uso do Legacy na declaração de conjunto de dados abertos, usei porque era a única maneira de obter um arquivo de destino em UTF-16LE sem usar a classe conversora. Normalmente não uso, mas como disse, apenas com esta adição foi escrito um arquivo em UTF-16LE no servidor de aplicativos. Acredite, li muito bem a documentação sobre OPEN DATASET. Diz

"Abrir um arquivo legado . A adição EM MODO BINÁRIO LEGADO abre o arquivo como um arquivo binário, exatamente como na adição EM MODO BINÁRIO , exceto que neste caso também podem ser especificadas a ordem de bytes e a página de códigos com as quais o arquivo deve ser manipulado.

Então, essa foi a razão e a ÚNICA forma que pude baixar em UTF-16 com Little Endian (se não usar a classe conversora). Como disse, o resultado desta declaração (apenas em combinação com LEGACY) é um arquivo em UTF-16 Little Endian, mas por alguma razão a SAP internamente tenta primeiro converter para a página de códigos 1100. Ainda me pergunto por quê. Poderia ser um erro de instalação do meu sistema SAP?

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

De onde vem o código da página 1100? Alguma ideia? Por que o SAP tenta converter 4103 para 1100 quando o SAP é um sistema unicode que utiliza CP 4103 (= UTF-16) e o arquivo alvo também é UTF-16?

Você precisa ler a documentação ABAP de OPEN DATASET. Aqui o culpado é O MODO LEGADO. Nunca o uso a menos que precise converter para um código de página preciso (exceto Unicode que é especial, ver abaixo).


Alguém pode me dizer qual é a forma correta de baixar um arquivo UTF-16LE que contém um sinal de euro (parte do código de página UTF-16!!)?

A única forma de fazer isso é convertendo-o você mesmo usando CL_ABAP_CODEPAGE ou CL_ABAP_CONV_CE_OUT, depois adicionando cl_abap_char_utilities=>BYTE_ORDER_MARK_LITTLE no início e escrevendo o xstring no dataset aberto EM MODO BINÁRIO (não use LEGACY).

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

De onde vem o código da página 1100? Alguma ideia? Por que o SAP tenta converter 4103 para 1100 quando o SAP é um sistema unicode que utiliza CP 4103 (= UTF-16) e o arquivo de destino também é UTF-16?

Precisa ler a documentação do ABAP de OPEN DATASET. Aqui o culpado é o MODO LEGADO. Nunca o use a menos que precise converter para um código de página preciso (exceto Unicode que é especial, ver abaixo).


Alguém pode me dizer qual é a maneira correta de baixar um arquivo UTF-16LE que contém um sinal de euro (parte do código de página UTF-16!)?

A única forma de fazer isso é convertê-lo você mesmo usando CL_ABAP_CODEPAGE ou CL_ABAP_CONV_CE_OUT, então adicionar cl_abap_char_utilities=>BYTE_ORDER_MARK_LITTLE no início e escrever o xstring no dataset aberto EM MODO BINÁRIO (não use 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?