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.