Acentuação FWRest AdvPL

Bom dia,

Estou utilizando o FWRest para consumir uma API.

Tal API, devolve um JSon, com palavras acentuadas.

No consumo da API via FWRest, setei o Header do FWRest da seguinte forma:

aHeader := {"Content-Type: application/json; charset=utf-8"}

Setei o UTF 8, e no Get faço da seguinte forma:

oAPI:Get(aHeader)

Consigo obter o retorno da API normalmente, porém os caracteres acentuados não estão sendo retornados de forma correta, mesmo setando o UTF 8.

Exemplo do retorno da API:

Em vez de Retornar Fabricação retorna assim: Fabricação

Como faço para o FWRest retornar os caracteres acentuados de forma correta?

Obrigado.

Altera a codificação para uma padrão do Protheus:


::SetContentType("application/json; charset=iso-8859-1")

Em anexo eu mandei um exemplo.

Ou então usa a DecodeUTF-8 (tem até documentação desta inconsistência).

:warning: Atenção: Esta publicação foi transferida automaticamente do fórum antigo, mas os anexos não foram incluídos.

Atenção com o uso sugerido pelo Guilherme. A RFC que estabeleceu o Content-Type: application/json definiu como padrão o encode para utf8 este tipo de conteúdo e formato.
Indicar no header o charset é de fato o jeito certo, mas não é garantia de não sofrer com efeitos colaterais nas leituras dos browses e webviews por ter saído do padrão de encode para application/json.

Bom dia,

Ao que entendi, você recebeu o conteúdo em formato UTF8, você precisa fazer o decode desse valor, tente utilizar a função DecodeUTF8 no retorno da API: http://tdn.totvs.com/display/tec/DecodeUTF8

Isso é necessário, pois por padrão, o AppServer trabalha com windows-1252.

Estou com problema semelhante, tentei usar o DecodeUTF8, mas ele retorna nil e no console do servidor aparece a mensagem “Warning (DecodeUtf8) Invalid conversion from utf-8 to cp1252”
Tem alguma outra função que posso usar ou vou ter que tratar caracter por caracter para remove os inválidos?

O retorno nulo do DecodeUTF8 é para quando o conteúdo já tinha sofrido decode antes. Para os casos que isso acontecer deve ser utilizado o valor antes de passar na função como valor decodado.


cStr := 'algum valor utf8'
cNewStr := DecodeUTF8(cStr)

if cNewStr == nil
    cNewStr := cStr
endif

Josimar, identifiquei o problema aqui.
Na API que estamos consumindo existe no meio do texto alguns emojis tipo (https://getemoji.com/ ) adicionei o link dos emoji porque quando colo um aqui não deixa salva o comentário. Quando chama o DecodeUT8() e tem algum emoji ai retorna nil, quando não tem o emoji funciona certo.
Terei que fazer algum tratamento para remove os emojis antes de usar o DecodeUTF8.

Fala Emerson, você conseguiu resolver a bronca de retirar os emojis?

Consegui aqui!

Na criação do método estava atribuindo: ::SetContentType("application/json")

O retorno ficava: PISTAO � 40 MM

Modifiquei para: ::SetContentType("application/json; charset=iso-8859-1")

O retorno ficou: PISTAO Ø 40 MM

Valeu pessoal!