“Â € ™” visualizzato sulla pagina anziché “'”


133

’viene visualizzato sulla mia pagina anziché '.

Ho Content-Typeimpostato UTF-8sia nel mio <head>tag che nelle mie intestazioni HTTP:

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

inserisci qui la descrizione dell'immagine

Inoltre, il mio browser è impostato su Unicode (UTF-8):

inserisci qui la descrizione dell'immagine

Quindi qual è il problema e come posso risolverlo?


Risposte:


55

Assicurarsi che il browser e l'editor stiano utilizzando la codifica UTF-8 anziché ISO-8859-1 / Windows-1252.

Oppure usa &rsquo;.


75
No, non è risolto. C'è ancora un'incoerenza nella codifica dei caratteri nella tua applicazione. Incontrerai lo stesso problema in futuro per altri personaggi non CP1252. E ce ne sono molti ...
BalusC

12
Esempi di personaggi che continuerai a incontrare: i18nqa.com/debug/utf8-debug.html
Zoot

codifica utf-8 +1
Karuhanga,

217

Allora, qual'è il problema,

È un personaggio ( RIGHT SINGLE QUOTATION MARK- U + 2019) che viene decodificato come CP-1252 anziché UTF-8 . Se si seleziona la codifiche tavolo, poi si vede che questo personaggio è in UTF-8, composto di byte 0xE2, 0x80e 0x99. Se si controlla il layout di pagina di codice CP-1252 , poi vedrete che ognuno di questi byte si distinguono per i singoli caratteri â, e .


e come posso ripararlo?

Utilizzare UTF-8 invece di CP-1252 per leggere, scrivere, memorizzare e visualizzare i caratteri.


Ho Content-Type impostato su UTF-8 sia nel mio <head>tag che nelle mie intestazioni HTTP:

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

Questo indica solo al client quale codifica utilizzare per interpretare e visualizzare i caratteri. Ciò non indica al proprio programma quale codifica utilizzare per leggere, scrivere, archiviare e visualizzare i caratteri. La risposta esatta dipende dalla piattaforma lato server / database / linguaggio di programmazione utilizzato. Si noti che quello impostato nell'intestazione della risposta HTTP ha la precedenza sul meta tag HTML. Il meta tag HTML verrebbe utilizzato solo quando la pagina viene aperta dal file system del disco locale anziché da HTTP.


Inoltre, il mio browser è impostato su Unicode (UTF-8):

Ciò impone solo al client quale codifica utilizzare per interpretare e visualizzare i caratteri. Ma il vero problema è che stai già inviando ’(codificato in UTF-8) al client anziché . Il client viene visualizzato correttamente ’utilizzando la codifica UTF-8. Se il client fosse stato erroneamente utilizzato, ad esempio ISO-8859-1, probabilmente avresti visto ââ¬â¢invece.


Sto usando ASP.NET 2.0 con un database.

Questo è molto probabilmente dove si trova il tuo problema. È necessario verificare con uno strumento di database indipendente l'aspetto dei dati.

Se il personaggio è presente, non ti stai collegando correttamente al database. Devi dire al connettore del database di usare UTF-8.

Se il tuo database contiene ’, allora è il tuo database ad essere incasinato. Molto probabilmente le tabelle non sono configurate per l'uso UTF-8. Al contrario, utilizzano la codifica predefinita del database, che varia in base alla configurazione. Se questo è il tuo problema, in genere è sufficiente modificare la tabella per utilizzare UTF-8. Se il tuo database non lo supporta, dovrai ricreare le tabelle. È buona norma impostare la codifica della tabella quando la si crea.

Molto probabilmente stai usando SQL Server, ma ecco un po 'di codice MySQL (copiato da questo articolo ):

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

Se il tuo tavolo è già UTF-8, allora devi fare un passo indietro. Chi o cosa ci ha messo i dati. Ecco dove si trova il problema. Un esempio potrebbe essere rappresentato dai valori inviati dai moduli HTML codificati / decodificati in modo errato.


Ecco alcuni altri collegamenti per saperne di più sul problema:


2
Se hai contenuto rotto come questo salvato da qualche parte, ad esempio in un database mysql, stackoverflow.com/a/9407998/117647 ha il trucco necessario per convertire i personaggi in utf-8
Steve

5
TL; DR; Utilizzare UTF-8 per leggere, scrivere, archiviare e visualizzare i caratteri.
c0degeas,

Si noti che le tabelle iso-8859-1 e Windows-1252 si sovrappongono, quindi alcune "combinazioni di caratteri strani" sono comuni a entrambi (ad esempio "Ã ©" per "é").
Skippy le Grand Gourou,

15

Ho alcuni documenti che mostravano come …e êmostravano come ê. Ecco come è arrivato lì (codice 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

Per risolvere il problema, ho usato il codice Python in questo modo:

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)

(Dato che qualcuno aveva inserito la versione twillata in un documento UTF-8 corretto, in realtà ho dovuto estrarre solo la parte twillata, rimuoverla e reinserirla. Ho usato BeautifulSoup per questo.)

È molto più probabile che tu abbia un Charlie nella creazione di contenuti piuttosto che la configurazione del web server sia sbagliata. Puoi anche forzare il tuo browser Web a modificare la pagina selezionando la codifica windows-1252 per un documento utf-8. Il tuo browser non è in grado di separare il documento salvato da Charlie.

Nota : lo stesso problema può verificarsi con qualsiasi altra tabella codici a byte singolo (es. Latin-1) invece di windows-1252.


14

(Unicode codepoint U+2019 RIGHT SINGLE QUOTATION MARK) è codificato in UTF-8 come byte:

0xE2 0x80 0x99.

’(Codici codici Unicode U+00E2 U+20AC U+2122) è codificato in UTF-8 come byte:

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

Questi sono i byte che il browser sta effettivamente ricevendo per produrre ’quando elaborati come UTF-8.

Ciò significa che i tuoi dati di origine stanno attraversando due conversioni di set di caratteri prima di essere inviati al browser:

  1. Il carattere di origine ( U+2019) viene prima codificato come byte UTF-8:

    0xE2 0x80 0x99

  2. quei singoli byte venivano quindi interpretati erroneamente e decodificati in punti di codice Unicode U+00E2 U+20AC U+2122da uno dei set di caratteri Windows-125X (1252, 1254, 1256 e 1258 tutti mappati 0xE2 0x80 0x99a U+00E2 U+20AC U+2122), e quindi quei punti di codice venivano codificati come byte UTF-8:

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

È necessario trovare dove viene eseguita la conversione aggiuntiva nel passaggio 2 e rimuoverla.


12

Questo a volte accade quando una stringa viene convertita da Windows-1252 a UTF-8 due volte .

Lo avevamo in un'applicazione Zend / PHP / MySQL in cui personaggi del genere apparivano nel database, probabilmente a causa della connessione MySQL che non specificava il set di caratteri corretto. Abbiamo dovuto:

  1. Assicurati che Zend e PHP stessero comunicando con il database in UTF-8 ( non era di default)

  2. Ripara i caratteri rotti con diverse query SQL come questa ...

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

    Fallo per tutte le tabelle / colonne necessarie.

Puoi anche correggere alcune di queste stringhe in PHP, se necessario. Si noti che poiché i caratteri sono stati codificati due volte , in realtà è necessario eseguire una conversione inversa da UTF-8 a Windows-1252, che all'inizio mi ha confuso.

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

9

Hai una discrepanza nella codifica del personaggio; la tua stringa è codificata in una codifica (UTF-8) e qualunque cosa stia interpretando questa pagina ne sta usando un'altra (diciamo ASCII).

Specifica sempre la codifica nelle intestazioni http e assicurati che corrisponda alla definizione di codifica del framework.

Intestazione http di esempio:

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

Impostazione della codifica in asp.net

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

Impostazione della codifica in jsp


7

Se il tuo tipo di contenuto è già UTF8, è probabile che i dati stiano già arrivando con una codifica errata. Se si stanno ottenendo i dati da un database, assicurarsi che la connessione al database utilizzi UTF-8.

Se si tratta di dati da un file, assicurarsi che il file sia codificato correttamente come UTF-8. Di solito puoi impostarlo nella finestra di dialogo "Salva con nome ..." dell'editor di tua scelta.

Se i dati sono già rotti durante la visualizzazione nel file di origine, è probabile che fosse un file UTF-8 ma che fosse stato salvato con una codifica errata da qualche parte lungo il percorso.


4

Se qualcuno riceve questo errore sul sito Web di WordPress, è necessario modificare il set di caratteri db wp-config:

define('DB_CHARSET', 'utf8mb4_unicode_ci');

invece di:

define('DB_CHARSET', 'utf8mb4');

0

In DBeaver (o altri editor) il file di script che stai lavorando può richiedere di salvare come UTF8 e questo cambierà il carattere:

â € “

in

–

o

–

-1

È necessario copiare / incollare il testo dal documento di Word. Il documento di Word utilizza le virgolette intelligenti. Puoi sostituirlo con un carattere speciale (& rsquo;) o semplicemente digitare il tuo editor HTML (').

Sono sicuro che questo risolverà il tuo problema.


-3

La stessa cosa mi è successa con il carattere '-' (segno meno lungo).
Ho usato questo semplice sostituto quindi risolvilo:

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

4
Il problema dell'OP è mojibake, non caratteri Unicode simili.
Cole Johnson,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.