PHP-Ausgabe zeigt kleine schwarze Diamanten mit einem Fragezeichen
Ich Schreibe ein php-Programm zieht aus einer Datenbank-Quelle. Einige der varchars haben, Zitate, die angezeigt werden, als schwarze Rauten mit einem Fragezeichen (�, ERSATZZEICHENgehe ich davon aus Microsoft Word-text).
Wie kann ich mit php auf strip diese Zeichen aus?
InformationsquelleAutor der Frage | 2008-11-09
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Sie sehen, dass Zeichen (�"U+FFFD" "ERSATZ-CHARAKTER"), ist es in der Regel bedeutet, dass der text selbst kodiert wird, in irgendeiner form von single-byte-Codierung, sondern interpretiert in einem der unicode-Kodierungen (UTF8 oder UTF16).
Wenn es andersherum wäre es (in der Regel) so Aussehen: ä.
Wahrscheinlich die ursprüngliche Zeichensatz-Kodierung ist ISO-8859-1, auch bekannt als Latin-1. Sie können dies überprüfen, ohne änderungen am Skript: Browser geben Ihnen die Möglichkeit zu re-interpretieren, eine Seite in einer anderen Kodierung -- in Firefox verwenden "Ansicht" -> "Character Encoding".
Des Browsers die Verwendung der richtigen Codierung, fügen Sie eine HTTP-header wie dieser:
oder legen Sie die Zeichenkodierung in einem meta-tag:
Alternativ könnten Sie versuchen, zu Lesen aus der Datenbank in eine andere Kodierung (UTF-8, vorzugsweise) oder konvertieren Sie den text mit
iconv()
.InformationsquelleAutor der Antwort hop
Dies ist ein charset-Problem. Als solches kann es schief gelaufen ist, das auf vielen verschiedenen Ebenen, aber die meisten wahrscheinlich, die strings in der Datenbank sind utf-8 kodiert, und präsentieren Sie Sie als iso-8859-1. Oder die andere Weise herum.
Den richtigen Weg, um dieses problem zu beheben, ist euer Charakter-sets gerade. Die einfachste Strategie, da Sie mit PHP, ist die Verwendung von iso-8859-1 in der gesamten Anwendung. Um dies zu tun, müssen Sie sicherstellen, dass:
charset=iso-8859-1
header
.accept-charset
- Attribut auf Ihre<form>
Elemente.Wenn Sie bereits Daten in Ihrer Datenbank haben, sollten Sie sich bewusst sein, dass Sie wahrscheinlich Durcheinander schon. Wenn Sie nicht bereits in der Produktionsphase, so wischen Sie es alle und fangen. Ansonsten wirst du noch einige Daten zu bereinigen.
Ein Hinweis auf meta-tags, da jeder missversteht, was Sie sind:
Wenn ein web-server dient, eine Datei (HTML-Dokument), es sendet einige Informationen, die präsentiert sich nicht direkt im browser. Dies ist bekannt als HTTP-Header. Ein solcher header ist der
Content-Type
header, gibt den MIME-Typ der Datei (ZB.text/html
) sowie die Codierung (aka charset).Während die meisten Webserver sendet eine
Content-Type
header mitcharset
info, es ist optional. Falls er nicht vorhanden ist, wird der browser stattdessen interpretieren Sie keine meta-tags mithttp-equiv="Content-Type"
. Es ist wichtig zu erkennen, dass der meta-tag ist nur interpretiert werden, wenn der webserver nicht senden Sie die Kopfzeile. In der Praxis bedeutet dies, dass es nur verwendet, wenn die Seite auf der Festplatte gespeichert und dann geöffnet aus.Auf dieser Seite hat eine sehr gute Erklärung für diese Dinge.
InformationsquelleAutor der Antwort troelskn
Ich auch angesichts dieser � Problem. Mittlerweile lief ich in drei Fällen, wo es passiert ist:
substr()
War ich mit
substr()
auf einem UTF8-string, der die cut-UTF8-Zeichen, damit der Schnitt chars könnten nicht korrekt angezeigt werden. Verwendenmb_substr($utfstring, 0, 10, 'utf-8');
statt. Creditshtmlspecialchars()
Ein weiteres problem war die Verwendung
htmlspecialchars()
auf einen UTF8-string. Die Lösung ist zu verwenden:htmlspecialchars($utfstring, ENT_QUOTES, 'UTF-8');
preg_replace()
Schließlich fand ich heraus, dass
preg_replace()
zu Problemen führen kann mit UTF. Der code$string = preg_replace('/[^A-Za-z0-9ÄäÜüÖöß]/', ' ', $string);
zum Beispiel transformiert die UTF-string "F(×)=2×-3" in "F � 2� ". Der fix ist die Verwendungmb_ereg_replace()
statt.Ich hoffe diese zusätzlichen Informationen helfen, um loszuwerden von solchen Problemen.
InformationsquelleAutor der Antwort Kai Noack
Sicherstellen, dass Ihre MYSQL-Verbindung auf UTF-8 eingestellt (oder latin1 benutzen, je nachdem, was Sie verwenden), können Sie dies tun an:
oder verwenden, um zu überprüfen, welchem Zeichensatz Sie verwenden:
Weitere Infos hier: http://php.net/manual/en/function.mysql-set-charset.php
InformationsquelleAutor der Antwort ptwiggerl
Wie bereits in früheren Antworten, es ist passiert, weil Ihr text wurde geschrieben, um die Datenbank in
iso-8859-1
Codierung, oder jedes andere format.So brauchen Sie nur, die Daten zu konvertieren, um
utf8
vor der Ausgabe.InformationsquelleAutor der Antwort Hamlet Kraskian
Basierend auf Ihrer Beschreibung des Problems, die Daten in Ihrer Datenbank ist fast sicher verschlüsselt Windows-1252und Ihre Seite ist fast sicher diente als ISO-8859-1. Diese beiden Zeichensätze sind gleichwertig, außer, dass Windows-1252 hat 16 zusätzliche Zeichen, die nicht in ISO-8859-1, einschließlich linke und Rechte geschweifte Anführungszeichen.
Davon aus, meine Analyse ist richtig, die einfachste Lösung ist, um zu dienen, Ihre Seite als Windows-1252. Dies funktioniert, weil alle Zeichen, die in ISO-8859-1 auch in Windows-1252. In PHP können Sie die Kodierung ändern, wie folgt:
Jedoch, Sie wirklich sollten überprüfen, welche Zeichenkodierung Sie benutzen in Ihren HTML-Dateien und den Inhalt der Datenbank, und kümmern sich um konsequent zu sein, oder ordnungsgemäß konvertiert, wo dies nicht möglich ist.
InformationsquelleAutor der Antwort Daniel Cassidy
Wählte ich die Streifen diese Zeichen aus dem string, indem dies zu tun -
InformationsquelleAutor der Antwort DropHit
Versuchen Sie Dies Bitte
mb_substr($description, 0, 490, "UTF-8");
InformationsquelleAutor der Antwort Vishal P Gothi
Folge von unicode oder anderen Zeichensatz überein. Ändern Sie die Zeichenkodierung in Ihrem browser, in den Einstellungen der text Aussehen wird, OK. Dann ist es die Frage, wie konvertieren Sie Ihre Datenbank-Inhalte, um Zeichensatz Sie verwenden für die Anzeige. (Das kann eigentlich nur das hinzufügen von utf-8-charset-Anweisung zur Ausgabe.)
InformationsquelleAutor der Antwort che
was ich am Ende machen, in Ende, nachdem ich meine Feste Tische war, um es wieder und wieder ändern die Einstellungen auf utf-8 dann veränderte ich meine dump-Datei, so dass DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci sind meine Zeichensatz-Einträge
nun habe ich nicht characterset Probleme mehr, weil die Datenbank und browser utf8.
Habe ich herausgefunden, was Sie verursacht. Es war die web-Seite+browser Auswirkungen auf die DB. Auf den terminals, linux (ubuntu+firefox) war es, die Kodierung der Datenbank in latin1 ist, was die tabes gesetzt sind. Aber auf dem windows 10+edge-terminals, wurden die Einträge force-codiert in utf8. Auch habe ich bemerkt, das windows 10 hat Fragen bleiben mit latin1 also beschloss ich, biegen sich mit dem wind und alle konvertieren zu utf8.
Ich dachte, es war eine windows-10-Problem, weil wir begonnen haben, mit win 10 Klemmen.
also doch wieder microsoft-Fehler verursacht Probleme. Ich weiß immer noch nicht, warum die encoding-änderungen an den Formularen, da der browser in windows 10 zeigt das characterset latin1, aber wenn es geht in seiner utf8-codiert und ich bekomme die Daten Anomalie. aber in linux+firefox es nicht tun.
InformationsquelleAutor der Antwort drtechno
Fügen Sie diese Funktion, um Ihre Variablen
utf8_encode($variable);
InformationsquelleAutor der Antwort rk_programmer
Für Globale Zwecke.
Statt konvertieren, codieren, decodifying jeder text, den ich lieber lassen, wie Sie sind und stattdessen ändern Sie die server-php-Einstellungen.
So,
"text-Codierung" und finden Sie die eine, die wir Sie sehen, Ihr text
richtig.
Bearbeiten Sie Ihre php.ini und fügen Sie hinzu:
default_charset = "ISO-8859-1"
oder anstelle von ISO-8859, die eine, die passt Ihr text-Codierung.
InformationsquelleAutor der Antwort vivoconunxino
Können Sie auch die caracter in Ihrem browser eingestellt ist. Nur für debug-Gründen.
InformationsquelleAutor der Antwort powtac
Verwenden den gleichen Zeichensatz (wie hier vorgeschlagen) in der Datenbank und die HTML hat nicht bei mir funktioniert... Also daran erinnern, dass der code generiert wird, als HTML, die ich wählte, um die Nutzung der
"
(HTML-code) oder den"
(ISO-Latin-1-code) in meine Datenbank text, wo Zitate verwendet wurden. Dies löste das problem zwar, um mir ein Anführungszeichen. Es ist merkwürdig, zu beachten, dass vor dieser Lösung, nur ein paar Anführungszeichen und Apostrophe werden nicht richtig angezeigt, während andere haben, jedoch die speziellen code hat funktioniert, in allen Instanzen.InformationsquelleAutor der Antwort GrafixGuy
Lief ich "detect encoding" code nach meiner Sortierung ändern in phpmyadmin und jetzt kommt es als Latin_1.
aber hier ist etwas, was ich kam über suchen Sie eine andere Daten-Anomalie in meiner Anwendung, und wie ich es behoben:
Ich habe gerade importierte eine Tabelle mit mixed encoding (mit Diamant Fragezeichen in einigen Zeilen, und alle waren in der gleichen Spalte.) so hier ist mein Update-code. Ich verwendet, utf8_decode Vorgang, den unbestimmten Platzhalter und weist eine nur Fragezeichen an der Stelle des "diamond Fragezeichen" dann habe ich str_replace ersetzen Sie das Fragezeichen mit einem Leerzeichen zwischen den Anführungszeichen.
hier ist die
[code]
InformationsquelleAutor der Antwort drtechno
Dies geschah in meinem Fall:
Ich, macht die " black diamond-Zeichen in ein Fragezeichen so können Sie:
InformationsquelleAutor der Antwort JacobRossDev
Nur fügen Sie diese Zeilen vor dem Header.
Genaue format der
.doc/docx
- Dateien abgerufen werden:InformationsquelleAutor der Antwort asma
Wenn Sie Daten extrahieren aus, überall, das Sie verwenden sollten Funktionen mit dem Präfix
md_FUNC_NAME
.Hatte das gleiche problem, es half mir.
Oder Sie finden den code dieses symbols und verwenden Sie regexp zum löschen dieser Symbole.
InformationsquelleAutor der Antwort Роман Захряпа
Dies wird Ihnen helfen. Setzen Sie dieses innen
<head>
tagInformationsquelleAutor der Antwort Prasant Kumar
Gehen Sie zu Ihrem phpmyadmin und wählen Sie Ihre Datenbank aus und erhöhen Sie einfach die Länge/Wert der Tabelle Feld zu 500 oder 1000 es wird Ihr problem lösen.
InformationsquelleAutor der Antwort