Pergunta

’ está aparecendo na minha página em vez de '.

Eu tenho o Content-Type definido como UTF-8 em ambos <head> Tag e meus cabeçalhos HTTP:

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

enter image description here

Além disso, meu navegador está definido como Unicode (UTF-8):

enter image description here

Então, qual é o problema e como posso corrigi -lo?

Foi útil?

Solução

Verifique se o navegador e o editor estão usando a codificação UTF-8 em vez de ISO-8859-1/Windows-1252.

Ou uso &rsquo;.

Outras dicas

Então qual é o problema,

É um (RIGHT SINGLE QUOTATION MARK - U+2019) personagem que foi codificado como CP-1252 ao invés de UTF-8. Se você verificar o codificações Tabela, então você vê que esse personagem está no UTF-8 composto por bytes 0xE2, 0x80 e 0x99. Se você verificar o Layout da página de código CP-1252, então você verá que cada um desses bytes representa os personagens individuais â, e .


E como posso consertar isso?

Use o UTF-8 em vez do CP-1252 para ler, escrever, armazenar e exibir os caracteres.


Eu tenho o conjunto de conteúdo para UTF-8 nos meus <head> Tag e meus cabeçalhos HTTP:

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

Isso apenas instrui o cliente que codifica a usar para interpretar e exibir os caracteres. Isso não instrui seu próprio programa que codificando para ler, escrever, armazenar e exibir os caracteres. A resposta exata depende da plataforma do servidor / banco de dados / linguagem de programação usada. Observe que o definido no cabeçalho da resposta HTTP tem precedência sobre a metatag html. A tag meta HTML só seria usada quando a página for aberta no sistema de arquivos de disco local, em vez de http.


Além disso, meu navegador está definido como Unicode (UTF-8):

Isso apenas força o cliente que codifica a usar para interpretar e exibir os caracteres. Mas o problema real é que você já está enviando ’ (codificado em UTF-8) ao cliente em vez de . O cliente está exibindo corretamente ’ usando a codificação UTF-8. Se o cliente fosse insinúcido para usar, por exemplo, ISO-8859-1, você provavelmente teria visto ââ¬â¢ em vez de.


Estou usando asp.net 2.0 com um banco de dados.

É mais provável que esteja seu problema. Você precisa verificar com uma ferramenta de banco de dados independente como é os dados.

Se o O personagem está lá, então você não está se conectando ao banco de dados corretamente. Você precisa dizer ao conector do banco de dados para usar o UTF-8.

Se o seu banco de dados contiver ’, então é o seu banco de dados que está bagunçado. Provavelmente, as tabelas não estão configuradas para usar UTF-8. Em vez disso, eles usam a codificação padrão do banco de dados, que varia dependendo da configuração. Se esse é o seu problema, geralmente apenas alterar a tabela para usar o UTF-8 é suficiente. Se o seu banco de dados não suportar isso, você precisará recriar as tabelas. É uma boa prática definir a codificação da tabela quando você a cria.

Você provavelmente está usando o SQL Server, mas aqui está algum código MySQL (copiado de Este artigo):

CREATE DATABASE db_name CHARACTER SET utf8;
CREATE TABLE tbl_name (...) CHARACTER SET utf8;

Se sua tabela, no entanto, já estiver UTF-8, você precisará dar um passo atrás. Quem ou o que coloque os dados lá. Isso é onde está o problema. Um exemplo seria os valores enviados do formulário HTML que são codificados/decodificados incorretamente.


Aqui estão mais alguns links para saber mais sobre o problema:

Eu tenho alguns documentos onde estava mostrando como … e ê estava mostrando como ê. Foi assim que chegou lá (código Python):

# Adam edits original file using windows-1252
windows = '\x85\xea' 
# that is HORIZONTAL ELLIPSIS, LATIN SMALL LETTER E WITH CIRCUMFLEX

# Beth reads it correctly as windows-1252 and writes it as utf-8
utf8 = windows.decode("windows-1252").encode("utf-8")
print(utf8)

# Charlie reads it *incorrectly* as windows-1252 writes a twingled utf-8 version
twingled = utf8.decode("windows-1252").encode("utf-8")
print(twingled)

# detwingle by reading as utf-8 and writing as windows-1252 (it's really utf-8)
detwingled = twingled.decode("utf-8").encode("windows-1252")

assert utf8==detwingled

Para corrigir o problema, usei o código Python como este:

with open("dirty.html","rb") as f:
    dt = f.read()
ct = dt.decode("utf8").encode("windows-1252")
with open("clean.html","wb") as g:
    g.write(ct)

(Como alguém havia inserido a versão dividida em um documento UTF-8 correto, eu realmente tive que extrair apenas a parte torcida, detwingle-a e inseri-lo de volta. Eu usei o BeautifulSoup para isso.)

É muito mais provável que você tenha um charlie na criação de conteúdo do que a configuração do servidor da Web está errada. Você também pode forçar seu navegador da web a dobrar a página selecionando o Windows-1252 codificando para um documento UTF-8. Seu navegador da web não pode detwingle o documento que Charlie salvou.

Observação: O mesmo problema pode acontecer com qualquer outra página de código de bytes (por exemplo, latim-1) em vez do Windows-1252.

(Unicode CodePoint U+2019 RIGHT SINGLE QUOTATION MARK) é codificado no UTF-8 como bytes:

0xE2 0x80 0x99.

’ (Unicode codePoints U+00E2 U+20AC U+2122) é codificado no UTF-8 como bytes:

0xC3 0xA2   0xE2 0x82 0xAC   0xE2 0x84 0xA2.

Estes são os bytes que seu navegador está realmente recebendo para produzir ’ Quando processado como UTF-8.

Isso significa que seus dados de origem estão passando dois Conversões de charset antes de ser enviado ao navegador:

  1. A fonte personagem (U+2019) é codificado pela primeira vez como UTF-8 bytes:

    0xE2 0x80 0x99

  2. Esses bytes individuais estavam então sendo mal interpretado e decodificado para unicode codePoints U+00E2 U+20AC U+2122 por um dos Windows-125x charsets (1252, 1254, 1256 e 1258 All Map 0xE2 0x80 0x99 para U+00E2 U+20AC U+2122) e, em seguida, esses pontos codepados estão sendo codificados como bytes UTF-8:

    0xE2 -> U+00E2 -> 0xC3 0xA2
    0x80 -> U+20AC -> 0xE2 0x82 0xAC
    0x99 -> U+2122 -> 0xE2 0x84 0xA2

Você precisa encontrar onde a conversão extra na etapa 2 está sendo executada e removê -la.

Você tem uma incompatibilidade em seu personagem codificando; Sua sequência é codificada em uma codificação (UTF-8) e o que quer que esteja interpretando esta página está usando outra (digamos ASCII).

Sempre especifique sua codificação nos cabeçalhos HTTP e verifique se isso corresponde à definição de codificação da sua estrutura.

Amostra de cabeçalho HTTP:

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

Configuração de codificação no ASP.NET

<configuration>
  <system.web>
    <globalization
      fileEncoding="utf-8"
      requestEncoding="utf-8"
      responseEncoding="utf-8"
      culture="en-US"
      uiCulture="de-DE"
    />
  </system.web>
</configuration>

Configuração de codificação no JSP

Isso às vezes acontece quando uma corda é convertida De Windows-1252 a UTF-8 duas vezes.

Tínhamos isso em um aplicativo ZEND/PHP/MYSQL, onde personagens como esse estavam aparecendo no banco de dados, provavelmente devido à conexão MySQL não especificar o conjunto de caracteres correto. Nós tivemos que:

  1. Garantir que Zend e PHP estavam se comunicando com o banco de dados no UTF-8 (foi não por padrão)

  2. Repare os caracteres quebrados com várias consultas SQL como esta ...

    UPDATE MyTable SET 
    MyField1 = CONVERT(CAST(CONVERT(MyField1 USING latin1) AS BINARY) USING utf8),
    MyField2 = CONVERT(CAST(CONVERT(MyField2 USING latin1) AS BINARY) USING utf8);
    

    Faça isso por tantas tabelas/colunas forem necessárias.

Você também pode corrigir algumas dessas seqüências de strings no PHP, se necessário. Observe que porque os personagens foram codificados duas vezes, na verdade precisamos fazer uma conversão reversa a partir de UTF-8 de volta ao Windows-1252, que me confundiu no começo.

mb_convert_encoding('’', 'Windows-1252', 'UTF-8');    // returns ’

Se o seu tipo de conteúdo já estiver UTF8, é provável que os dados já estejam chegando na codificação errada. Se você estiver obtendo os dados de um banco de dados, verifique se a conexão do banco de dados usa o UTF-8.

Se esses são dados de um arquivo, verifique se o arquivo está codificado corretamente como UTF-8. Geralmente, você pode definir isso na caixa de diálogo "Salvar como ..." do editor de sua escolha.

Se os dados já estiverem quebrados quando você os visualiza no arquivo de origem, é provável que ele seja um arquivo UTF-8, mas foi salvo na codificação errada em algum lugar ao longo do caminho.

Se alguém receber esse erro no site do WordPress, você precisará alterar o charset wp-config db:

define('DB_CHARSET', 'utf8mb4_unicode_ci');

ao invés de:

define('DB_CHARSET', 'utf8mb4');

Você deve ter um texto de copiar/colar no documento do Word. Word Document Use Smart Quotes. Você pode substituí -lo por caracteres especial (') ou simplesmente digitar seu editor HTML (').

Tenho certeza de que isso resolverá seu problema.

A mesma coisa aconteceu comigo com o personagem ' -' (Longo Minus Sign).
Eu usei essa substituição simples, então resolva -o:

htmlText = htmlText.Replace('–', '-');
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top