it-swarm.dev

Problemas de codificação HTML - o caractere "Â" é exibido em vez de "& nbsp;"

Eu tenho um aplicativo legado apenas começando a se comportar mal, por qualquer motivo que eu não tenho certeza. Ele gera um monte de HTML que é transformado em PDF relatórios pelo ActivePDF.

O processo funciona assim:

  1. Puxar um modelo HTML de um banco de dados com tokens para ser substituído (por exemplo, "~ CompanyName ~", "~ CustomerName ~", etc.)
  2. Substitua os tokens por dados reais
  3. Arrume o HTML com uma função regex simples em que a propriedade forma valores de atributos de tags HTML (garante aspas, etc, já que o mecanismo de renderização do ActivePDF odeia qualquer coisa além de aspas simples ao redor dos valores dos atributos)
  4. Envie o HTML para um serviço da Web que cria o PDF.

Em algum lugar nessa confusão, os espaços não separáveis ​​do modelo HTML (o  s) são codificados como ISO-8859-1, de modo que aparecem incorretamente como um caractere "Â" ao visualizar o documento em um navegador (FireFox). O ActivePDF atua nesses caracteres não UTF8.

Minha pergunta: como não sei de onde vem o problema e não tenho tempo para investigá-lo, existe uma maneira fácil de recodificar ou encontrar e substituir os caracteres ruins? Eu tentei enviá-lo através desta pequena função que eu joguei juntos, mas transforma tudo em gobbledegook não muda nada.

Private Shared Function ConvertToUTF8(ByVal html As String) As String
    Dim isoEncoding As Encoding = Encoding.GetEncoding("iso-8859-1")
    Dim source As Byte() = isoEncoding.GetBytes(html)
    Return Encoding.UTF8.GetString(Encoding.Convert(isoEncoding, Encoding.UTF8, source))
End Function

Alguma ideia?

EDIT:

Eu estou conseguindo com isso por agora, embora dificilmente pareça uma boa solução:

Private Shared Function ReplaceNonASCIIChars(ByVal html As String) As String
    Return Regex.Replace(html, "[^\u0000-\u007F]", " ")
End Function
191
Cᴏʀʏ

Em algum lugar nessa confusão, os espaços não separáveis ​​do modelo HTML (os) estão codificando como ISO-8859-1, de modo que eles aparecem incorretamente como um caractere "Â"

Isso seria codificar para UTF-8, não ISO-8859-1. O caractere de espaço sem quebra é de byte 0xA0 em ISO-8859-1; quando codificado para UTF-8, seria 0xC2,0xA0, que, se você (incorretamente) o visualizar como ISO-8859-1, sai como " ". Isso inclui um nbsp à direita que você pode não estar percebendo; se esse byte não estiver lá, alguma outra coisa prejudicou o seu documento e precisamos ver mais adiante para descobrir o quê.

Qual é o regexp, como funciona o modelo? Parece haver um analisador de HTML adequado envolvido em algum lugar se as cadeias de caracteres de   estão (corretamente) sendo transformadas em U + 00A0 caracteres de espaço não-invasivo. Em caso afirmativo, você poderia simplesmente processar seu modelo nativamente no DOM e solicitar que ele serializasse usando a codificação ASCII para manter caracteres não-ASCII como referências de caracteres. Isso também impediria que você precisasse fazer o pós-processamento de regex no próprio HTML, que é sempre um negócio altamente desonesto.

Bem, de qualquer forma, por enquanto você pode adicionar um dos itens a seguir ao <head> do seu documento e ver se isso faz com que pareça correto no navegador:

  • para HTML4: <meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
  • para HTML5: <meta charset="utf-8">

Se você fez isso, então qualquer problema remanescente é culpa do ActivePDF.

324
bobince

Se alguém tivesse o mesmo problema que eu e o charset já estivesse correto, simplesmente faça o seguinte:

  1. Copie todo o código dentro do arquivo .html.
  2. Abra o bloco de notas (ou qualquer editor de texto básico) e cole o código.
  3. Vá em "Arquivo -> Salvar Como"
  4. Digite seu nome de arquivo "example.html" (selecione "Salvar como tipo: todos os arquivos (.)")
  5. Selecione Codificação como UTF-8
  6. Clique em Salvar e agora você pode excluir seu arquivo .html antigo e a codificação deve ser corrigida
23
Low

Problema: Mesmo eu estava enfrentando o problema onde estávamos enviando '£' com alguma string em POST request para o CRM System, mas quando estávamos fazendo a chamada GET do CRM, estava retornando '£' com algum conteúdo de string. Então, o que analisamos é que '£' estava sendo convertido para '£'.

Análise: A falha que encontramos depois de fazer uma pesquisa é que em POST chamada nós definimos HttpWebRequest ContentType como "text/xml" enquanto em GET A chamada foi "text/xml; charset: utf-8".

Solução: Então como parte da solução nós incluímos o pedido charset: utf-8 in POST e funciona.

11
Himanshu Tarsoliya