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


203

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

O processo funciona assim:

  1. Puxe 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. Organize o HTML com uma função simples de expressão regular que formata os valores dos atributos da tag HTML (garante aspas, etc, pois o mecanismo de renderização do ActivePDF odeia qualquer coisa, exceto aspas simples, em torno dos valores dos atributos)
  4. Envie o HTML para um serviço da web que cria o PDF.

Em algum lugar dessa bagunça, os espaços intermináveis ​​do (  s) modelo ( s) HTML são codificados como ISO-8859-1, para que apareçam incorretamente como um caractere "Â" ao exibir o documento em um navegador (FireFox). O ActivePDF vomita nesses caracteres não UTF8.

Minha pergunta: como não sei de onde o problema decorre 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 juntei, mas isso transforma tudo em devorador de livros 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?

EDITAR:

Por enquanto, estou resolvendo isso, 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

2
O HTML contém alguma meta informação para descrever seu conjunto de caracteres?
Rowland Shaw

1
[Comentário anterior excluído] Resposta curta: não.
Cᴏʀʏ

1
Para mim trabalhou: utf8_decode ()
ursuleacv 22/02

Respostas:


340

Em algum lugar dessa bagunça, os espaços intermináveis ​​do (s) modelo (s) HTML são codificados como ISO-8859-1, para que apareçam incorretamente como um caractere "Â"

Isso seria codificar para UTF-8, não para ISO-8859-1. O caractere de espaço sem quebra é o byte 0xA0 na ISO-8859-1; quando codificado em UTF-8, seria 0xC2,0xA0, que, se você (incorretamente) vê-lo 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á, outra coisa prejudicou seu documento e precisamos ver mais detalhes para descobrir o que.

Qual é o regexp, como funciona o modelo? Parece haver um analisador HTML adequado envolvido em algum lugar, se as  seqüências de caracteres estiverem (corretamente) sendo transformadas em caracteres U + 00A0 NON-BREAKING SPACE. Nesse caso, você pode apenas processar seu modelo nativamente no DOM e solicitar que ele serialize usando a codificação ASCII para manter caracteres não ASCII como referências de caracteres. Isso também impediria que você fizesse o pós-processamento de expressões regulares no próprio HTML, o que é sempre um negócio altamente desonesto.

Bem, de qualquer forma, por enquanto, você pode adicionar um dos seguintes itens ao documento <head>e ver se isso faz com que pareça certo 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, qualquer problema restante é culpa do ActivePDF.


20
Eu não recomendaria <meta charset="utf-8">ainda. A http-equivversão ainda é válida em HTML5 e é melhor suportada.
21912

8
Respostas de qual usar: <meta charset = 'utf-8'> vs <meta http-equiv = 'Content-Type' afirma que a versão curta é bem suportada.
Richard Ayotte


Funciona em todos os navegadores modernos . Certamente não funciona em todos os navegadores herdados e de nicho (por exemplo, móveis) ou em todas as aranhas.
21912

3
"Em algum lugar nessa bagunça" ... LOL! Bom aberto! Boa resposta! +1
Resist Design

24

Se alguém teve o mesmo problema que eu e o conjunto de caracteres já estava correto, basta fazer 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 o nome do arquivo "example.html" (selecione "Salvar como tipo: Todos os arquivos ( . )")
  5. Selecione Codificação como UTF-8
  6. Pressione Salvar e agora você pode excluir seu arquivo .html antigo e a codificação deve ser corrigida

2
Isso fez por mim. Agora no sublime diz em UTF-8 with BOMvez de UTF-8. Para ver isso em texto sublime, você precisa show_encodingdefinir trueem Configurações - Usuário.
J86

Eu tive o problema que mostrando uma vez de », amd ao usar esta solução o problema resolvido, mas há um aviso php: Warning: session_start(): Cannot send session cache limiter - headers already sent (output started at D:\Program Files\wamp\wamp\www\projects\kerala\kerala_public_html\edit\business_details.php:1) in D:\Program Files\wamp\wamp\www\projects\kerala\kerala_public_html\user\include\fg_membersite.php on line 152
SCC

Esta solução funcionou para mim. Eu estava trabalhando no bloco de notas ++ e quando o salvei no bloco de notas básico da Microsoft como UTF-8, depois de abrir o novo arquivo no bloco de notas ++, a codificação foi definida como UTF-8-BOM (o que não sei ao certo o que significa). De qualquer forma, esse parece ter sido o problema para mim.
BoltKey

Obrigado! Isso fez o truque. Vejo na solicitação / resposta que o arquivo (no meu caso, ASPX) foi codificado como UTF-8. O Notepad ++ também o codificou para UTF-8. Que diabos, certo? Mas sua solução fez o truque. Para mim, era uma frase em espanhol que não estava codificando corretamente na página. Eu li em outro lugar para não usar o UTF-8 BOM em espanhol, mas foi corrigido para mim.
user3621633

13

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

Análise: A falha que descobrimos depois de fazer uma pesquisa é que, na chamada POST, definimos HttpWebRequest ContentType como "text / xml", enquanto na GET Call era "text / xml; charset: utf-8" .

Solução: Como parte da solução, incluímos o charset: utf-8 na solicitação POST e funciona.


0

No meu caso, isso (a com acento circunflexo) ocorreu no código que eu gerei do visual studio usando minha própria ferramenta para gerar código. Foi fácil de resolver:

Selecione espaços únicos () no documento. Você poderá ver muitos espaços únicos com aparência diferente dos outros espaços únicos, eles não estão selecionados. Selecione esses outros espaços únicos - eles são os responsáveis ​​pelos caracteres indesejados no navegador. Vá para Localizar e substituir por espaço único (). Feito.

PS: é mais fácil ver todos os caracteres semelhantes quando você coloca o cursor em um ou se o seleciona no VS2017 +; Espero que outros IDEs tenham características semelhantes


-1

No meu caso, eu estava recebendo sinal de cruz latina em vez de nbsp, mesmo que uma página estivesse corretamente codificada no UTF-8. Nada acima ajudou na resolução do problema e tentei de tudo.

No final, a alteração da fonte do IE (com CSS específico do navegador) ajudou, eu estava usando Helvetica-Nue como fonte do corpo, alterando a Arial e resolvendo o problema.


A razão pela qual a mudança da fonte pode ter ajudado pode ser porque uma das fontes não continha o caractere em questão; portanto, o que você viu foi um caractere vazio. Mas isso não resolveu o problema, apenas o encobriu.
Oliver Hausler

-2

Eu estava tendo o mesmo tipo de problema. Aparentemente, é simplesmente porque o PHP não reconhece o utf-8.

Eu estava arrancando meu cabelo a princípio quando um sinal de '£' continuava aparecendo como 'Â £', apesar de parecer ok no DreamWeaver. Eventualmente, lembrei-me de que estava tendo problemas com links relativos ao arquivo de índice, quando as páginas, se visualizadas diretamente, funcionavam com apresentações de slides, mas não quando usadas com um include (mas isso não vem ao caso. De qualquer forma, eu me perguntava se isso poderia ser um problema semelhante, então, em vez de colocar na página que eu estava tendo problemas, eu simplesmente o coloquei no arquivo index.php - problema corrigido por toda parte.



-2

Bem, eu também tenho esse problema em meus poucos sites e tudo o que preciso fazer é personalizar o buscador de conteúdo para HTML. antes disso, mais os apago mais, então apenas mude sua função html fiter ou parsing para a página e ela funcionou. É principalmente devido aos editores de HTML na maioria dos CMSs. a maneira como eles armazenam a análise dos dados causou esse problema (no meu caso). Que isso também ajude no seu caso

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.