"- mostrando na página em vez de" '"


133

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

Eu tenho o Content-Typeconjunto UTF-8em minha <head>tag e meus cabeçalhos HTTP:

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

insira a descrição da imagem aqui

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

insira a descrição da imagem aqui

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


Respostas:


55

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

Ou use &rsquo;.


75
Não, não está resolvido. Ainda há uma inconsistência na codificação de caracteres no seu aplicativo. Você encontrará novamente o mesmo problema no futuro para outros caracteres que não sejam do CP1252. E há um monte deles ... #
2119 BalusC

12
Exemplos de caracteres que você continuará a encontrar: i18nqa.com/debug/utf8-debug.html
Zoot

codificação utf-8 +1
Karuhanga 18/18

217

Então qual é o problema,

É um caractere ( RIGHT SINGLE QUOTATION MARK- U + 2019) que está sendo decodificado como CP-1252 em vez de UTF-8 . Se você verificar o codificações mesa, então você vê que este personagem está em UTF-8 composto por bytes 0xE2, 0x80e 0x99. Se você verificar o layout da página de códigos CP-1252 , verá que cada um desses bytes representa os caracteres individuais â, e .


e como posso corrigir isso?

Use UTF-8 em vez de CP-1252 para ler, gravar, armazenar e exibir os caracteres.


Eu tenho o Tipo de conteúdo definido como UTF-8 na minha <head>tag e nos meus cabeçalhos HTTP:

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

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


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

Isso força apenas o cliente que codificação usar para interpretar e exibir os caracteres. Mas o problema real é que você já está enviando ’(codificado em UTF-8) para o cliente em vez de . O cliente está sendo exibido corretamente ’usando a codificação UTF-8. Se o cliente foi mal instruído a usar, por exemplo, ISO-8859-1, você provavelmente já viu ââ¬â¢.


Estou usando o ASP.NET 2.0 com um banco de dados.

Provavelmente, esse é o seu problema. Você precisa verificar com uma ferramenta de banco de dados independente a aparência dos dados.

Se o personagem estiver lá, você não estará se conectando ao banco de dados corretamente. Você precisa informar ao conector do banco de dados para usar o UTF-8.

Se o seu banco de dados contém ’, é o seu banco de dados que está bagunçado. Provavelmente as tabelas não estão configuradas para uso 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 UTF-8 é suficiente. Se 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á um código MySQL (copiado deste artigo ):

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

Se sua tabela já é UTF-8, você precisa dar um passo atrás. Quem ou o que colocou os dados lá. Éque está o problema. Um exemplo seria os valores enviados pelo formulário HTML que foram codificados / decodificados incorretamente.


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


2
Se você quebrou conteúdo como este salvo em algum lugar por exemplo, em um banco de dados mysql, stackoverflow.com/a/9407998/117647 tem o truque que você precisa para converter os caracteres em utf-8
Steve

5
TL; DR; Use UTF-8 para ler, escrever, armazenar e exibir os caracteres.
C0degeas

Observe que as tabelas iso-8859-1 e Windows-1252 se sobrepõem; portanto, algumas "combinações de caracteres estranhos" são comuns a ambas (por exemplo, "©" para "é").
Skippy le Grand Gourou

15

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 código python assim:

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 inseriu a versão dobrada em um documento UTF-8 correto, na verdade eu tive que extrair apenas a parte dobrada, desenrolá-la e inseri-la novamente. 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 estar incorreta. Você também pode forçar seu navegador a twingle a página, selecionando a codificação windows-1252 para um documento utf-8. Seu navegador da web não pode desvincular o documento que Charlie salvou.

Nota : o mesmo problema pode ocorrer com qualquer outra página de código de byte único (por exemplo, latin-1) em vez do windows-1252.


14

(Ponto de código Unicode U+2019 RIGHT SINGLE QUOTATION MARK) é codificado em UTF-8 como bytes:

0xE2 0x80 0x99.

’(Pontos de código Unicode U+00E2 U+20AC U+2122) é codificado em UTF-8 como bytes:

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

Esses são os bytes que seu navegador está realmente recebendo para produzir ’quando processados ​​como UTF-8.

Isso significa que seus dados de origem estão passando por duas conversões de conjunto de caracteres antes de serem enviados ao navegador:

  1. O caractere de origem ( U+2019) é codificado pela primeira vez como bytes UTF-8:

    0xE2 0x80 0x99

  2. esses bytes individuais estavam sendo mal interpretados e decodificados para pontos U+00E2 U+20AC U+2122de código Unicode por um dos charsets do Windows-125X (1252, 1254, 1256 e 1258 todos mapeados 0xE2 0x80 0x99para U+00E2 U+20AC U+2122) e, em seguida, esses pontos de código 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 descobrir onde a conversão extra na etapa 2 está sendo executada e removê-la.


12

Às vezes, isso acontece quando uma string é convertida do Windows-1252 para UTF-8 duas vezes .

Tivemos isso em um aplicativo Zend / PHP / MySQL, onde caracteres assim estavam aparecendo no banco de dados, provavelmente devido à conexão do MySQL não especificar o conjunto de caracteres correto. Nós tivemos que:

  1. Verifique se o Zend e o PHP estavam se comunicando com o banco de dados em UTF-8 ( não era 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 para quantas tabelas / colunas forem necessárias.

Você também pode corrigir algumas dessas strings no PHP, se necessário. Observe que, como os caracteres foram codificados duas vezes , na verdade precisamos fazer uma conversão reversa de UTF-8 para Windows-1252, o que me confundiu a princípio.

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

9

Você tem uma incompatibilidade na sua codificação de caracteres; sua string é codificada em uma codificação (UTF-8) e o que estiver 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.

Exemplo de cabeçalho http:

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

Definindo 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>

Definindo codificação em jsp


7

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

Se forem dados de um arquivo, verifique se o arquivo está codificado corretamente como UTF-8. Normalmente, 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 visualizar no arquivo de origem, é provável que eles fossem um arquivo UTF-8, mas tenham sido salvos na codificação errada em algum lugar ao longo do caminho.


4

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

define('DB_CHARSET', 'utf8mb4_unicode_ci');

ao invés de:

define('DB_CHARSET', 'utf8mb4');

0

No DBeaver (ou em outros editores), o arquivo de script que você está trabalhando pode solicitar que seja salvo como UTF8 e isso mudará o caractere:

â € ”

para dentro

–

ou

–

-1

Você deve ter copiar / colar texto do documento do Word. O documento do Word usa aspas inteligentes. Você pode substituí-lo por Caractere Especial () ou simplesmente digitar seu editor HTML (').

Tenho certeza que isso resolverá seu problema.


-3

O mesmo aconteceu comigo com o caractere '-' (sinal de menos).
Eu usei essa substituição simples, então resolva-a:

htmlText = htmlText.Replace('–', '-');

4
O problema do OP é mojibake, não caracteres Unicode semelhantes.
Cole Johnson
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.