Dados são passados para um campo de string ao ler o conjunto de dados. Aqui não posso usar xstring, então não preciso fazer a etapa 2 neste caso.
Não, na verdade você deve usar xstring, pois deve abrir o arquivo no modo binário (conforme a documentação da SAP que citei anteriormente, essa é a única forma de ler um arquivo codificado em UTF-16). Abaixo, mostro uma versão curta que você poderia tentar como ponto de partida (nunca testei, então pode ser que precise fazer alguns ajustes):
DADOS:
file TIPO string,
data TIPO xstring,
file_content TIPO xstring,
conv_in TIPO REF PARA cl_abap_conv_in_ce,
xml_string TIPO string.
* Ler o arquivo UTF-16 como arquivo binário
ABRIR CONJUNTO DE DADOS file PARA ENTRADA NO MODO BINÁRIO.
FAÇA.
LER CONJUNTO DE DADOS file NO CAMPO data.
SE sy-subrc = 0.
CONCATENAR file_content data NO file_content NO MODO BYTE.
SENÃO.
SAIR.
FIM-SE.
FIM-FAÇA.
FECHAR CONJUNTO DE DADOS file.
* Converter a sequência hexadecimal file_content com dados do arquivo em uma sequência
conv_in = cl_abap_conv_in_ce=>create(
codificação = 'UTF-16'
* endian = ' ' " o valor padrão deve estar bom
entrada = file_content ).
conv_in->ler( IMPORTANDO dados = xml_string ).
SUBSTITUIR PRIMEIRA OCORRÊNCIA DE SUBSTRING 'UTF-16' POR 'UTF-8' IGNORANDO MAIÚSCULAS.
* Escrever novo arquivo usando codificação UTF-8
CONCATENAR 'utf8_' file
Respondido el 15/04/2024
LUCIANO RIOJA GHIOTTO
Se unió el 13/07/2019
Olá Herald,
Os dados são passados para um campo de string enquanto lê-se o conjunto de dados Read. Aqui não posso usar xstring.
então não preciso fazer a etapa 2 neste caso.
No passo 3, você está me dizendo para substituir UTF-16 por UTF-8 na string xml? Isso está correto?
Obrigado antecipadamente.
Hhmm, interessante. Pensei que deveria ser simples, mas as duas soluções que me ocorreram parecem um pouco complicadas. A primeira forma provavelmente seria usar a biblioteca iXML , onde o ponto de partida é a classe CL_IXML . Você pode encontrar a documentação da SAP [aqui|http://help.sap.com/saphelp_nw04/helpdata/en/86/8280d212d511d5991b00508b6b8b11/frameset.htm].
Depois há uma abordagem "manual": Usar OPEN DATASET para ler o arquivo UTF-16, depois modificar o atributo de codificação XML e salvá-lo como arquivo UTF-8. Não é simples, porque a tentadora opção de comando [OPEN DATASET .. LEGACY TEXT MODE CODE PAGE|http://help.sap.com/abapdocu_70/en/ABAPOPEN_DATASET_MODE.htm] não funciona. Segundo a ajuda do ABAP:
Para a especificação da página de códigos cp, espera-se um objeto de dados de tipo caractere que deve conter - no momento da execução da sentença - a etiqueta de uma página não Unicode desde a coluna CPCODEPAGE na tabela de base de dados TCP00. Uma página Unicode não deve ser especificada.
Parece que esperam que a maioria dos arquivos Unicode sejam UTF-8. Mas essa poderia ser a razão pela qual você quer convertê-lo...
Então siga os seguintes passos:
<ol><li>Abra o arquivo como um arquivo binário (a única opção para UTF-16, veja [aqui|http://help.sap.com/abapdocu_70/en/ABAPOPEN_DATASET_ENCODING.htm]) através de [OPEN DATASET file FOR INPUT IN BINARY MODE|http://help.sap.com/abapdocu_70/en/ABAPOPEN_DATASET.htm] e leia o conteúdo em XSTRING usando [READ DATASET|http://help.sap.com/abapdocu_70/en/ABAPREAD_DATASET.htm].</li>
<li>Converta para uma string usando a classe de utilidade [CL_ABAP_CONV_IN_CE|http://help.sap.com/saphelp_nw04/helpdata/en/79/c554afb3dc11d5993800508b6b8b11/frameset.htm], veja exemplo [aqui|http://wiki.sdn.sap.com/wiki/display/Snippets/ABAP Code Page+Conversions].</li>
<li>Substitua a marca de codificação para UTF-16 no XML por uma referência a UTF-8.</li>
<li>Escreva o conteúdo XML novamente em um arquivo 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] e [TRANSFER|http://help.sap.com/abapdocu_70/en/ABAPTRANSFER.htm]</li></ol>
Talvez alguém tenha uma forma mais curta...
Saudações, harald
Hmm, interessante. Pensei que deveria ser simples, mas as duas soluções que pensei parecem um pouco complicadas. A primeira forma provavelmente seria usar a biblioteca iXML , onde o ponto de partida é a classe CL_IXML . Você pode encontrar a documentação do SAP [aqui|http://help.sap.com/saphelp_nw04/helpdata/en/86/8280d212d511d5991b00508b6b8b11/frameset.htm].
Depois há uma "abordagem manual": Usar OPEN DATASET para ler o arquivo UTF-16, depois modificar o atributo de codificação XML e salvá-lo como arquivo UTF-8. Não é simples, porque a tentadora opção de comando [OPEN DATASET .. LEGACY TEXT MODE CODE PAGE|http://help.sap.com/abapdocu_70/en/ABAPOPEN_DATASET_MODE.htm] não funciona. Segundo a ajuda do ABAP:
Para a especificação da página de códigos cp, é esperado um objeto de dados de tipo caractere que deve conter - - no momento da execução da declaração - a etiqueta de uma página não Unicode da coluna CPCODEPAGE na tabela de base de dados TCP00. Uma página Unicode não deve ser especificada.
Uau, parece que esperam que a maioria dos arquivos Unicode sejam UTF-8. Mas essa poderia ser a razão pela qual você quer convertê-lo...
Então siga os seguintes passos:
<ol><li>Abra o arquivo como um arquivo binário (a única opção para UTF-16, veja [aqui|http://help.sap.com/abapdocu_70/en/ABAPOPEN_DATASET_ENCODING.htm]) através de [OPEN DATASET file FOR INPUT IN BINARY MODE|http://help.sap.com/abapdocu_70/en/ABAPOPEN_DATASET.htm] e leia o conteúdo em XSTRING usando [READ DATASET|http://help.sap.com/abapdocu_70/en/ABAPREAD_DATASET.htm].</li>
<li>Converta-o para uma string usando a classe de utilidade [CL_ABAP_CONV_IN_CE|http://help.sap.com/saphelp_nw04/helpdata/en/79/c554afb3dc11d5993800508b6b8b11/frameset.htm], veja o exemplo [aqui|http://wiki.sdn.sap.com/wiki/display/Snippets/ABAP Code Page+Conversions].</li>
<li>Substitua a marca de codificação para UTF-16 no XML por uma referência a UTF-8.</li>
<li>Escreva o conteúdo XML novamente em um arquivo 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] e [TRANSFER|http://help.sap.com/abapdocu_70/en/ABAPTRANSFER.htm]</li></ol>
Talvez alguém tenha uma forma mais curta...
Saudações, harald