"Â € ™" s'affiche sur la page au lieu de "'"


133

’s'affiche sur ma page au lieu de '.

J'ai Content-Typedéfini UTF-8dans ma <head>balise et mes en-têtes HTTP:

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

entrez la description de l'image ici

De plus, mon navigateur est configuré pour Unicode (UTF-8):

entrez la description de l'image ici

Alors, quel est le problème et comment puis-je le résoudre?


Réponses:


55

Assurez-vous que le navigateur et l'éditeur utilisent le codage UTF-8 au lieu de ISO-8859-1 / Windows-1252.

Ou utilisez &rsquo;.


75
Non, ce n'est pas résolu. Il existe toujours une incohérence dans le codage des caractères dans votre application. Vous rencontrerez à nouveau le même problème à l'avenir pour d'autres personnages non CP1252. Et il y en a beaucoup ...
BalusC

12
Exemples de personnages que vous allez continuer à rencontrer: i18nqa.com/debug/utf8-debug.html
Zoot

encodage utf-8 +1
Karuhanga

217

Donc quel est le problème,

C'est un caractère ( RIGHT SINGLE QUOTATION MARK- U + 2019) qui est décodé en CP-1252 au lieu de UTF-8 . Si vous cochez la encodages table, vous voyez que ce personnage est en UTF-8 composé d'octets 0xE2, 0x80et 0x99. Si vous vérifiez la mise en page de la page de codes CP-1252 , vous verrez que chacun de ces octets représente les caractères individuels â, et .


et comment puis-je résoudre ce problème?

Utilisez UTF-8 au lieu de CP-1252 pour lire, écrire, stocker et afficher les caractères.


J'ai le Content-Type défini sur UTF-8 dans ma <head>balise et mes en-têtes HTTP:

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

Cela indique uniquement au client le codage à utiliser pour interpréter et afficher les caractères. Cela n'indique pas à votre propre programme quel encodage utiliser pour lire, écrire, stocker et afficher les caractères. La réponse exacte dépend de la plate-forme / base de données / langage de programmation côté serveur utilisé. Notez que celui défini dans l'en-tête de réponse HTTP a la priorité sur la balise meta HTML. La balise meta HTML ne serait utilisée que lorsque la page est ouverte à partir du système de fichiers du disque local au lieu de HTTP.


De plus, mon navigateur est configuré pour Unicode (UTF-8):

Cela force uniquement le client quel encodage utiliser pour interpréter et afficher les caractères. Mais le problème réel est que vous envoyez déjà ’(encodé en UTF-8) au client au lieu de . Le client s'affiche correctement en ’utilisant le codage UTF-8. Si le client avait été mal instruit pour utiliser, par exemple ISO-8859-1, vous auriez probablement vu à la ââ¬â¢place.


J'utilise ASP.NET 2.0 avec une base de données.

C'est probablement là que réside votre problème. Vous devez vérifier avec un outil de base de données indépendant à quoi ressemblent les données.

Si le caractère est là, c'est que vous ne vous connectez pas correctement à la base de données. Vous devez indiquer au connecteur de base de données d'utiliser UTF-8.

Si votre base de données contient ’, c'est votre base de données qui est en panne. Très probablement, les tables ne sont pas configurées pour être utilisées UTF-8. Au lieu de cela, ils utilisent le codage par défaut de la base de données, qui varie en fonction de la configuration. Si tel est votre problème, il suffit généralement de modifier la table pour utiliser UTF-8. Si votre base de données ne prend pas en charge cela, vous devrez recréer les tables. Il est recommandé de définir le codage de la table lorsque vous la créez.

Vous utilisez probablement SQL Server, mais voici du code MySQL (copié à partir de cet article ):

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

Si votre table est cependant déjà UTF-8, alors vous devez prendre du recul. Qui ou quoi a mis les données là-bas. C'est là que réside le problème. Un exemple serait les valeurs soumises par formulaire HTML qui sont incorrectement codées / décodées.


Voici quelques liens supplémentaires pour en savoir plus sur le problème:


2
Si vous avez un contenu cassé comme celui-ci enregistré quelque part, par exemple dans une base de données mysql, stackoverflow.com/a/9407998/117647 a l'astuce dont vous avez besoin pour convertir les caractères en utf-8
Steve

5
TL, DR; Utilisez UTF-8 pour lire, écrire, stocker et afficher les caractères.
c0degeas

Notez que les tables iso-8859-1 et Windows-1252 se chevauchent, donc certaines «combinaisons de caractères étranges» sont communes aux deux (par exemple «Ã ©» pour «é»).
Skippy le Grand Gourou

15

J'ai quelques documents où montrait comme …et êmontrait comme ê. Voici comment cela est arrivé (code 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

Pour résoudre le problème, j'ai utilisé du code python comme celui-ci:

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)

(Parce que quelqu'un avait inséré la version twingled dans un document UTF-8 correct, je devais en fait extraire uniquement la partie twingled, la séparer et la réinsérer. J'ai utilisé BeautifulSoup pour cela.)

Il est beaucoup plus probable que vous ayez un Charlie dans la création de contenu que la configuration du serveur Web soit erronée. Vous pouvez également forcer votre navigateur Web à tinter la page en sélectionnant l'encodage windows-1252 pour un document utf-8. Votre navigateur Web ne peut pas séparer le document que Charlie a enregistré.

Remarque : le même problème peut se produire avec n'importe quelle autre page de codes à un octet (par exemple latin-1) au lieu de windows-1252.


14

(Unicode codepoint U+2019 RIGHT SINGLE QUOTATION MARK) est encodé en UTF-8 sous forme d'octets:

0xE2 0x80 0x99.

’(Points de code Unicode U+00E2 U+20AC U+2122) est codé en UTF-8 sous forme d'octets:

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

Ce sont les octets que votre navigateur reçoit réellement afin de produire ’lorsqu'il est traité en UTF-8.

Cela signifie que vos données source subissent deux conversions de jeux de caractères avant d'être envoyées au navigateur:

  1. Le caractère source ( U+2019) est d'abord encodé en octets UTF-8:

    0xE2 0x80 0x99

  2. ces octets individuels ont ensuite été mal interprétés et décodés en points U+00E2 U+20AC U+2122de code Unicode par l'un des jeux de caractères Windows-125X (1252, 1254, 1256 et 1258 tous mappés 0xE2 0x80 0x99vers U+00E2 U+20AC U+2122), puis ces points de code sont codés en octets UTF-8:

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

Vous devez trouver où la conversion supplémentaire à l'étape 2 est effectuée et la supprimer.


12

Cela arrive parfois lorsqu'une chaîne est convertie à partir de Windows-1252 en UTF-8 deux fois .

Nous avions cela dans une application Zend / PHP / MySQL où des caractères comme celui-ci apparaissaient dans la base de données, probablement à cause de la connexion MySQL ne spécifiant pas le jeu de caractères correct. Nous devions:

  1. Assurez-vous que Zend et PHP communiquaient avec la base de données en UTF-8 (ce n'était pas par défaut)

  2. Réparez les caractères cassés avec plusieurs requêtes SQL comme celle-ci ...

    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);
    

    Faites cela pour autant de tables / colonnes que nécessaire.

Vous pouvez également corriger certaines de ces chaînes en PHP si nécessaire. Notez que parce que les caractères ont été encodés deux fois , nous devons en fait effectuer une conversion inverse de UTF-8 vers Windows-1252, ce qui m'a déconcerté au début.

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

9

Vous avez une discordance dans l'encodage de vos caractères; votre chaîne est encodée dans un encodage (UTF-8) et tout ce qui interprète cette page en utilise un autre (disons ASCII).

Spécifiez toujours votre encodage dans vos en-têtes http et assurez-vous que cela correspond à la définition d'encodage de votre framework.

Exemple d'en-tête http:

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

Définition du codage dans asp.net

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

Définition de l'encodage dans jsp


7

Si votre type de contenu est déjà UTF8, il est probable que les données arrivent déjà dans le mauvais encodage. Si vous récupérez les données d'une base de données, assurez-vous que la connexion à la base de données utilise UTF-8.

S'il s'agit de données d'un fichier, assurez-vous que le fichier est correctement encodé en UTF-8. Vous pouvez généralement le définir dans la boîte de dialogue "Enregistrer sous ..." de l'éditeur de votre choix.

Si les données sont déjà brisées lorsque vous les affichez dans le fichier source, il y a de fortes chances qu'il s'agisse d'un fichier UTF-8, mais qu'il a été enregistré dans le mauvais encodage quelque part en cours de route.


4

Si quelqu'un obtient cette erreur sur le site Web WordPress, vous devez modifier le jeu de caractères wp-config db:

define('DB_CHARSET', 'utf8mb4_unicode_ci');

au lieu de:

define('DB_CHARSET', 'utf8mb4');

0

Dans DBeaver (ou d'autres éditeurs), le fichier de script que vous travaillez peut inviter à enregistrer en UTF8 et cela changera le caractère:

-

dans

–

ou

–

-1

Vous devez avoir copier / coller du texte à partir d'un document Word. Le document Word utilise des citations intelligentes. Vous pouvez le remplacer par un caractère spécial (& rsquo;) ou simplement taper dans votre éditeur HTML (').

Je suis sûr que cela résoudra votre problème.


-3

La même chose m'est arrivée avec le caractère «-» (signe moins long).
J'ai utilisé ce remplacement simple, alors résolvez-le:

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

4
Le problème de l'OP est mojibake, pas des caractères Unicode similaires.
Cole Johnson
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.