HTML é uma linguagem baseada em tags. Estas tags são definidas através de caracteres reservados (símbolos "<" e ">"). Além disso, as tags podem conter atributos definidos na forma: nome_do_atributo="valor" ou nome_do_atributo='valor'.
Com o uso de caracteres reservados, existe a necessidade de um mecanismo para representar estes mesmos caracteres fora do contexto nos quais são reservados. Ou seja, se desejamos mostrar um sinal de menor num documento HTML, precisamos representá-lo de outra forma, caso contrário, o interpretador de HTML pode achar que é um caractere reservado indicando o início de uma nova tag. O mecanismo que permite representar caracteres no HTML é chamado de HTML entities (ou "Entidades HTML").
Uma entity é representada por um símbolo "&" seguido de um identificador e finalizado com um ";" (ponto e vírgula). O identificador pode ser representado de 3 formas:
- Um número decimal (código do símbolo na tabela Unicode) prefixado por "#"
- Um número hexadecimal insensível à caixa (código do símbolo na tabela Unicode) prefixado por "#x" ou "#X"
- Um identificador textual definido em um arquivo DTD que é convertido para forma numérica (é usado para mais fácil memorização)
Exemplo de representação do símbolo "ç":
ç ç ç ç ç ç
A princípio, um documento HTML define qual codificação utiliza e não precisa codificar todos os símbolos. Porém, alguns navegadores podem não entender todas as codificações, causando problemas de exibição. Usando HTML entities, permite uma espécie de "independência de codificação". Afinal, o arquivo final será codificado em ASCII puro.
HTML Entities e os Sistemas de Informação
Em sistemas de informação, é muito importante ter controle sobre o conteúdo dinâmico, para que ele seja exibido corretamente ao usuário. Por exemplo, em uma ferramenta para exibir os dados de um registro do BD, pode ser que em um dos campos textuais o usuário tenha usado caracteres como "<", ">", "&", etc. e isso pode tornar o documento HTML inválido caso seja mostrado diretamente da forma como veio do BD. Para isso, existem algumas funções em PHP próprias para isso:
- htmlspecialchars - Converte caracteres reservados ("&", """, "'", "<" e ">")
- htmlentities - Converte caracteres especiais em sua representação com entities
Para usá-las, é preciso informar a codificação do texto que está sendo exibido. A operação reversa pode ser obtida com a função html_entity_decode, lembrando que nem todas as codificações possuem todos os caracteres representados na forma de entity.
Além de usar estas funções em conteúdos dinâmicos apresentados dentro de uma tag, você também precisa usá-las sobre o conteúdo dinâmico de um atributo de tag. Caso contrário, um conteúdo dinâmico que possua o símbolo aspas simples ou aspas duplas poderia indicar o fechamento precipitado do conteúdo do atributo. Para isso, é utilizado um parâmetro para estas funções indicando que tipo de aspas foi utilizada por um atributo e como será o funcionamento da função.
Exemplo:
<div> <span class="label">Descrição:</span> <span id="descricao" title="<?php echo htmlentities($livro->descricao, ENT_QUOTES) ?>"> <?php echo htmlentities($livro->descricao, ENT_NOQUOTES) ?> </span> </div>
Os possíveis modos de funcionamento de htmlspecialchars e htmlentities em relação às aspas são:
- ENT_COMPAT - converte aspas duplas, mas não converte aspas simples.
- ENT_QUOTES - converte aspas duplas e aspas simples.
- ENT_NOQUOTES - não converte aspas duplas nem aspas simples.
Observações
A lista de entities usadas no DTD XHTML 1.0 são descritas nestes arquivos:
A função htmlentities não converte todas as entities definidas nestes arquivos. Ela usa a tabela retornada pela função get_html_translation_table, que pode ser jogada em uma variável, manipulada e usada na função strtr para realizar substituições.
Utilizando a extensão DOM, a classe pode converter entities automaticamente.
Lista de Entities Comuns
- á = á
- é = é
- í = í
- ó = ó
- ú = ú
- â = â
- ê = ê
- ô = ô
- ã = ã
- õ = õ
- à = à
- ç = ç
- & = &
- "e; = "
- < = <
- > = >
- © = ©
- º = º
- ª = ª
- ← = ←
- → = →
- … = …
4 comentários
Achei o assunto muito bem explicado. Talvez é por isso que ainda não fizeram comentários.
Invés de ter que passar por dezena de sites procurando uma solução completa, só precisei de passar por aqui. Pelo menos pra esclarecer as dúvidas gerais sim.
É bom pensar no baixo número de comentário por este ponto de vista, Osvaldo. O propósito deste blog, no final das contas, é ajudar quem esteja com alguma dificuldade ou dúvida sobre PHP ou algo relacionado.
Olá, boa noite.
Estou desenvolvendo uma solução, usando a framework zend e banco postgres. Estou com problemas com acentuação quando exibo em pdf. O sistema envia para o banco de dados a entities ç para representar a letra ç. Quando a exibo, o caracreres é cortando, não aparece. Alguém de vcs sabem como resolver isso??
grato pela ajuda
Olá, Jairo.
Isso vai depender da lib que você usou para gerar o PDF. O formato PDF aceita caracteres Unicode, mas pode ser que a lib que você usou não aceite.
Postar um comentário
Nota: fique a vontade para expressar o que achou deste artigo ou do blog.
Dica: para acompanhar as respostas, acesse com uma conta do Google e marque a opção "Notifique-me".
Atenção: o blogger não permite inclusão de tags nos comentários, por isso, use algum site externo para postar seu código com dúvidas e deixe o link aqui. Exemplo: pastebin.com