Exibindo símbolos Unicode em HTML

89

Eu quero simplesmente exibir os símbolos de marca (✔) e cruz (✘) em uma página HTML, mas ele aparece como uma caixa ou gosma - - obviamente algo a ver com a codificação.

Eu configurei a metatag para mostrar utf-8, mas obviamente algo está faltando.

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

Edit / Solution: A partir de comentários feitos, usando FireBug eu descobri que os cabeçalhos sendo passados ​​pela minha página eram na verdade "Content-Type: text / html" e não UTF-8. Olhando para o formato do arquivo usando o Notepad ++, meu arquivo foi formatado como "UTF-8 sem BOM". Mudando isso para apenas UTF-8, os símbolos agora são mostrados corretamente ... mas o firebug ainda parece indicar o mesmo tipo de conteúdo.

Peter Craig
fonte

Respostas:

56

Você deve garantir que os cabeçalhos do servidor HTTP estejam corretos.

Em particular, o cabeçalho:

Content-Type: text/html; charset=utf-8

deve estar presente.

A metatag é ignorada pelos navegadores se o cabeçalho HTTP estiver presente.

Verifique também se o arquivo está realmente codificado como UTF-8 antes de veiculá-lo, verifique / tente o seguinte:

  • Certifique-se de que seu editor o salve como UTF-8.
  • Certifique-se de que seu FTP ou qualquer programa de transferência de arquivos não mexa com o arquivo.
  • Tente com entidades codificadas em HTML, como &#uuu;.
  • Para ter certeza, faça o hexdump do arquivo e veja como o caractere, para o ✔, deve ser E2 9C 94.

Nota: Se você usar um caractere Unicode para o qual seu sistema não consegue encontrar um glifo (nenhuma fonte com esse caractere), seu navegador deve exibir um ponto de interrogação ou algum bloco como o símbolo. Mas se você vir vários caracteres romanos como você, isso denota um problema de codificação.


fonte
Na verdade, a metatag não é ignorada, mas o cabeçalho HTTP tem precedência. Obrigado Konrad por essa precisão.
8
Observe que para usar um caractere Unicode na contentpropriedade de um ::beforeseletor CSS , seria necessário usar a notação de barra invertida. por exemplo: '\ 2713' em vez de '& # 2713'.
Fabien Snauwaert
18

Sei que uma resposta já foi aceita, mas gostaria de destacar algumas coisas.

Definir content-typee charseté obviamente uma boa prática, fazê-lo no servidor é muito melhor, porque garante a consistência em todo o aplicativo.

No entanto, eu usaria UTF-8apenas quando o idioma do meu aplicativo usa muitos caracteres que estão disponíveis apenas no conjunto de UTF-8caracteres. Se você deseja mostrar um caractere ou símbolo Unicode em um dos casos, pode fazê-lo sem alterar o charsetda sua página.

HTMLos representantes sempre foram capazes de exibir símbolos que não fazem parte do conjunto de caracteres de codificação da página, desde que você mencione o símbolo em seu numeric character reference (NCR). Parece estranho, mas é verdade.

Portanto, mesmo se você htmltiver um cabeçalho que declare que possui uma codificação de ansiou qualquer um dos conjuntos de isocaracteres, você pode exibir uma marca de seleção usando sua referência de caractere html, em decimal - & # 10003; ou em hexadecimal - & # x2713;

Portanto, é um pouco difícil entender por que você está enfrentando esse problema em suas páginas. Você pode verificar se o valor NCR está correto, esta é uma boa referência http://www.fileformat.info/info/unicode/char/2713/index.htm

Akshay
fonte
6
"No entanto, eu usaria UTF-8 apenas quando o idioma do meu aplicativo usa muitos caracteres que estão disponíveis apenas no conjunto de caracteres UTF-8" Por quê? Qual é a desvantagem de mudar?
dumbledad
3
@dumbledad: Pergunta muito boa, acho que deixei meu preconceito obscurecer minha resposta. O que eu quis dizer é que se o seu aplicativo inteiro já não for utf-8, alterá-lo vide aplicativo para uma única página pode ser muito trabalhoso. Além disso, se sua linguagem de programação e conteúdo não precisam de caracteres utf-8, você pode acidentalmente copiar e colar um caractere lixo que o seu editor aceitará (já que está no modo utf-8), mas o código falhará durante a execução. Dito isso, quando você puder, atualize sua codificação e conjunto de caracteres
Akshay
6

Certifique-se de realmente salvar o arquivo como UTF-8, como alternativa, use entidades HTML ( &#nnn;) para os caracteres especiais.

Guffa
fonte
Não parece haver uma entidade HTML para ✔ ou não percebi? Como você "realmente" salva o arquivo como UTF-8 e como pode verificar?
Peter Craig
@Peter: usando um editor decente. A maioria dos editores de texto tem uma opção em sua caixa de diálogo “salvar como” para especificar a codificação do arquivo, ou eles têm outra opção oculta em algum lugar em seu menu. O Vim usa a fileencodingconfiguração.
Konrad Rudolph
8
@Peter, você pode se referir a qualquer caractere por seu código. Experimente & # x2714; por um carrapato.
Dan Dyer
salve como utf-8. conceito interessante. funciona bem se você estiver criando páginas HTML estáticas. mas ... e as páginas da web dinâmicas? esse material de caractere Unicode / utf-8 / wide é realmente muito confuso para mim. meu código de back-end é perl. o cabeçalho http está configurado corretamente, assim como o cabeçalho html. O Verificador de Internacionalização do W3C confirma que o documento está definido como utf-8. o CaSinG é importante? finalmente, e as caixas de entrada de texto? eu ainda fico gosma! :(
Jarett Lloyd
adendo ao comentário anterior: meu banco de dados mostra que os dados foram inseridos corretamente e os caracteres são exibidos corretamente. portanto, não há problema de banco de dados meu script perl (ou melhor, o editor) está configurado para salvar os scripts como utf-8. meu servidor, apache2, tenho quase certeza de que não está interferindo ou está configurado corretamente. tudo isso dito, ainda não sei por que chars são gosma ugh. tem que haver uma maneira melhor
Jarett Lloyd
5

Ao contrário do proposto por Nicolas, a metatag não é realmente ignorada pelos navegadores. No entanto, o Content-Typecabeçalho HTTP sempre tem precedência sobre a presença de uma metatag no documento.

Portanto, certifique-se de enviar a codificação correta por meio do cabeçalho HTTP ou de não enviar esse cabeçalho HTTP (não recomendado). A metatag é principalmente uma opção de fallback para documentos locais que não são enviados via tráfego HTTP.

Usar entidades HTML também deve ser considerado uma solução alternativa - isso é evitar o problema real. Configurar o servidor da web corretamente evita muitos incômodos.

Konrad Rudolph
fonte
0

Eu acho que este é um problema de arquivo, você simplesmente salvou seu arquivo na codificação de 1 byte como o latin-1. Pesquise no Google seu editor e saiba como definir arquivos para utf-8.

Eu me pergunto por que existem editores que não usam o padrão utf-8.

Kugel
fonte