"- wird auf der Seite anstelle von" '"angezeigt


133

’wird auf meiner Seite statt angezeigt '.

Ich habe die Content-TypeEinstellung UTF-8sowohl in meinem <head>Tag als auch in meinen HTTP-Headern festgelegt:

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

Geben Sie hier die Bildbeschreibung ein

Außerdem ist mein Browser auf Folgendes eingestellt Unicode (UTF-8):

Geben Sie hier die Bildbeschreibung ein

Was ist das Problem und wie kann ich es beheben?


Antworten:


55

Stellen Sie sicher, dass der Browser und der Editor UTF-8-Codierung anstelle von ISO-8859-1 / Windows-1252 verwenden.

Oder verwenden &rsquo;.


75
Nein, es ist nicht gelöst. Die Zeichencodierung in Ihrer Anwendung weist immer noch eine Inkonsistenz auf. Sie werden in Zukunft erneut auf dasselbe Problem bei anderen Nicht-CP1252-Zeichen stoßen. Und es gibt ziemlich viele von ihnen ...
BalusC

12
Beispiele für Charaktere, denen Sie weiterhin begegnen werden: i18nqa.com/debug/utf8-debug.html
Zoot

utf-8 Codierung +1
Karuhanga

217

Also, was ist das Problem,

Es ist ein ( RIGHT SINGLE QUOTATION MARK- U + 2019) Zeichen, das als CP-1252 anstelle von UTF-8 dekodiert wird . Wenn Sie das Kontrollkodierungen Tabelle, dann sehen Sie , dass dieses Zeichen in UTF-8 ist von Bytes zusammengesetzt 0xE2, 0x80und 0x99. Wenn Sie das Kontroll CP-1252 - Codepage - Layout , dann werden Sie sehen , dass jedes dieser Bytes für die einzelnen Zeichen stehen â, und .


und wie kann ich das beheben?

Verwenden Sie UTF-8 anstelle von CP-1252, um die Zeichen zu lesen, zu schreiben, zu speichern und anzuzeigen.


Ich habe den Inhaltstyp sowohl in meinem <head>Tag als auch in meinen HTTP-Headern auf UTF-8 gesetzt :

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

Dies weist den Client nur an, welche Codierung zum Interpretieren und Anzeigen der Zeichen verwendet werden soll. Dies weist Ihr eigenes Programm nicht an, in welcher Codierung die Zeichen gelesen, geschrieben, gespeichert und angezeigt werden sollen. Die genaue Antwort hängt von der verwendeten serverseitigen Plattform / Datenbank / Programmiersprache ab. Beachten Sie, dass der im HTTP-Antwortheader festgelegte Vorrang vor dem HTML-Meta-Tag hat. Das HTML-Meta-Tag wird nur verwendet, wenn die Seite vom lokalen Datenträger-Dateisystem anstelle von HTTP geöffnet wird.


Außerdem ist mein Browser auf Folgendes eingestellt Unicode (UTF-8):

Dies zwingt den Client nur dazu, die Codierung zum Interpretieren und Anzeigen der Zeichen zu verwenden. Das eigentliche Problem ist jedoch, dass Sie bereits ’(in UTF-8 codiert) an den Client senden, anstatt . Der Client wird ’mithilfe der UTF-8-Codierung korrekt angezeigt . Wenn der Client falsch angewiesen wurde, beispielsweise ISO-8859-1 zu verwenden, hätten Sie wahrscheinlich ââ¬â¢stattdessen gesehen .


Ich verwende ASP.NET 2.0 mit einer Datenbank.

Hier liegt höchstwahrscheinlich Ihr Problem. Sie müssen mit einem unabhängigen Datenbank-Tool überprüfen, wie die Daten aussehen.

Wenn das Zeichen vorhanden ist, stellen Sie keine korrekte Verbindung zur Datenbank her. Sie müssen den Datenbankconnector anweisen, UTF-8 zu verwenden.

Wenn Ihre Datenbank enthält ’, ist es Ihre Datenbank, die durcheinander gebracht wird. Höchstwahrscheinlich sind die Tabellen nicht für die Verwendung konfiguriert UTF-8. Stattdessen verwenden sie die Standardcodierung der Datenbank, die je nach Konfiguration variiert. Wenn dies Ihr Problem ist, reicht es normalerweise aus, nur die Tabelle zu ändern, um UTF-8 zu verwenden. Wenn Ihre Datenbank dies nicht unterstützt, müssen Sie die Tabellen neu erstellen. Es wird empfohlen, die Codierung der Tabelle beim Erstellen festzulegen.

Sie verwenden höchstwahrscheinlich SQL Server, aber hier ist ein MySQL-Code (aus diesem Artikel kopiert ):

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

Wenn Ihre Tabelle jedoch bereits UTF-8 ist, müssen Sie einen Schritt zurücktreten. Wer oder was hat die Daten dort abgelegt. Das ist , wo das Problem ist. Ein Beispiel wären vom HTML-Formular übermittelte Werte, die falsch codiert / decodiert sind.


Hier sind einige weitere Links, um mehr über das Problem zu erfahren:


2
Wenn Sie solche Inhalte kaputt gemacht haben, die irgendwo gespeichert sind, z. B. in einer MySQL-Datenbank, hat stackoverflow.com/a/9407998/117647 den Trick, den Sie brauchen, um die Zeichen in utf-8 zu konvertieren
Steve

5
TL; DR; Verwenden Sie UTF-8, um die Zeichen zu lesen, zu schreiben, zu speichern und anzuzeigen.
c0degeas

Beachten Sie, dass sich die Tabellen iso-8859-1 und Windows-1252 überschneiden, sodass einige "seltsame Zeichenkombinationen" beiden gemeinsam sind (z. B. "Ã ©" für "é").
Skippy le Grand Gourou

15

Ich habe einige Dokumente, in denen als …und êals angezeigt wurde ê. So kam es dorthin (Python-Code):

# 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

Um das Problem zu beheben, habe ich folgenden Python-Code verwendet:

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)

(Da jemand die Twedled-Version in ein korrektes UTF-8-Dokument eingefügt hatte, musste ich tatsächlich nur den Twedled-Teil extrahieren, entflechten und wieder einfügen. Ich habe dafür BeautifulSoup verwendet.)

Es ist weitaus wahrscheinlicher, dass Sie einen Charlie bei der Erstellung von Inhalten haben, als dass die Webserverkonfiguration falsch ist. Sie können Ihren Webbrowser auch zwingen, die Seite zu zwitschern, indem Sie die Windows-1252-Codierung für ein utf-8-Dokument auswählen. Ihr Webbrowser kann das von Charlie gespeicherte Dokument nicht entschlüsseln.

Hinweis : Das gleiche Problem kann bei jeder anderen Einzelbyte-Codepage (z. B. Latin-1) anstelle von Windows-1252 auftreten.


14

(Unicode-Codepunkt U+2019 RIGHT SINGLE QUOTATION MARK) wird in UTF-8 als Byte codiert:

0xE2 0x80 0x99.

’(Unicode-Codepunkte U+00E2 U+20AC U+2122) wird in UTF-8 als Byte codiert:

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

Dies sind die Bytes, die Ihr Browser tatsächlich empfängt, um sie ’bei der Verarbeitung als UTF-8 zu erzeugen .

Das bedeutet, dass Ihre Quelldaten zwei Zeichensatzkonvertierungen durchlaufen, bevor sie an den Browser gesendet werden:

  1. Das Quellzeichen ( U+2019) wird zuerst als UTF-8-Byte codiert:

    0xE2 0x80 0x99

  2. diese einzelnen Bytes waren dann Fehl interpretiert und zu Unicode - Codepoints decodiert U+00E2 U+20AC U+2122von einem der Fenster-125X charsets (1252, 1254, 1256, 1258 und all Karte 0xE2 0x80 0x99zu U+00E2 U+20AC U+2122), und dann werden diese Codepunkte als UTF-8 - Bytes codiert ist:

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

Sie müssen herausfinden, wo die zusätzliche Konvertierung in Schritt 2 durchgeführt wird, und sie entfernen.


12

Dies passiert manchmal, wenn eine Zeichenfolge zweimal von Windows-1252 nach UTF-8 konvertiert wird .

Wir hatten dies in einer Zend / PHP / MySQL-Anwendung, in der solche Zeichen in der Datenbank angezeigt wurden, wahrscheinlich weil die MySQL-Verbindung nicht den richtigen Zeichensatz angab. Wir mussten:

  1. Stellen Sie sicher, dass Zend und PHP in UTF-8 mit der Datenbank kommunizieren ( nicht standardmäßig).

  2. Reparieren Sie die fehlerhaften Zeichen mit mehreren SQL-Abfragen wie dieser ...

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

    Tun Sie dies für so viele Tabellen / Spalten wie nötig.

Sie können einige dieser Zeichenfolgen bei Bedarf auch in PHP korrigieren. Da die Zeichen zweimal codiert wurden , müssen wir tatsächlich eine umgekehrte Konvertierung von UTF-8 zurück zu Windows-1252 durchführen, was mich zunächst verwirrte.

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

9

Sie haben eine Nichtübereinstimmung in Ihrer Zeichenkodierung; Ihre Zeichenfolge ist in einer Codierung (UTF-8) codiert, und was auch immer diese Seite interpretiert, verwendet eine andere (z. B. ASCII).

Geben Sie Ihre Codierung immer in Ihren http-Headern an und stellen Sie sicher, dass diese mit der Codierungsdefinition Ihres Frameworks übereinstimmt.

Beispiel für einen http-Header:

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

Festlegen der Codierung 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>

Einstellen der Codierung in jsp


7

Wenn Ihr Inhaltstyp bereits UTF8 ist, kommen die Daten wahrscheinlich bereits in der falschen Codierung an. Wenn Sie die Daten aus einer Datenbank abrufen, stellen Sie sicher, dass die Datenbankverbindung UTF-8 verwendet.

Wenn es sich um Daten aus einer Datei handelt, stellen Sie sicher, dass die Datei korrekt als UTF-8 codiert ist. Sie können dies normalerweise im Dialogfeld "Speichern unter ..." des Editors Ihrer Wahl einstellen.

Wenn die Daten bereits beschädigt sind, wenn Sie sie in der Quelldatei anzeigen, handelt es sich möglicherweise um eine UTF-8-Datei, die jedoch irgendwo in der falschen Codierung gespeichert wurde.


4

Wenn jemand diesen Fehler auf der WordPress-Website erhält, müssen Sie den Zeichensatz wp-config db ändern:

define('DB_CHARSET', 'utf8mb4_unicode_ci');

anstatt:

define('DB_CHARSET', 'utf8mb4');

0

In DBeaver (oder anderen Editoren) kann die Skriptdatei, an der Sie arbeiten, zum Speichern als UTF8 aufgefordert werden. Dadurch wird das Zeichen geändert:

-

in

–

oder

–

-1

Sie müssen Text aus Word-Dokument kopieren / einfügen. Word-Dokumente verwenden Smart Quotes. Sie können es durch ein Sonderzeichen (& rsquo;) ersetzen oder einfach Ihren HTML-Editor (') eingeben.

Ich bin sicher, das wird Ihr Problem lösen.


-3

Das gleiche passierte mir mit dem '-' Zeichen (langes Minuszeichen).
Ich habe diesen einfachen Ersatz verwendet, um ihn zu beheben:

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

4
Das Problem des OP ist Mojibake, keine ähnlichen Unicode-Zeichen.
Cole Johnson
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.