Ich schreibe ein PHP-Programm, das aus einer Datenbankquelle zieht. Einige der Varchars haben Anführungszeichen, die als schwarze Diamanten mit einem Fragezeichen angezeigt werden ( , ERSATZZEICHEN , nehme ich aus Microsoft Word-Text an).
Wie kann ich PHP verwenden, um diese Zeichen zu entfernen?
php
encoding
character-encoding
hakre
quelle
quelle
Antworten:
Wenn Sie dieses Zeichen sehen ( U + FFFD "REPLACEMENT CHARACTER"), bedeutet dies normalerweise, dass der Text selbst in einer Form von Einzelbyte-Codierung codiert, aber in einer der Unicode-Codierungen (UTF8 oder UTF16) interpretiert wird.
Wenn es umgekehrt wäre, würde es (normalerweise) ungefähr so aussehen: ¤.
Wahrscheinlich ist die ursprüngliche Codierung ISO-8859-1, auch bekannt als Latin-1. Sie können dies überprüfen, ohne Ihr Skript ändern zu müssen: Browser bieten Ihnen die Möglichkeit, eine Seite in einer anderen Codierung neu zu interpretieren. Verwenden Sie in Firefox "Ansicht" -> "Zeichencodierung".
Fügen Sie einen HTTP-Header wie folgt hinzu, damit der Browser die richtige Codierung verwendet:
header("Content-Type: text/html; charset=ISO-8859-1");
oder fügen Sie die Codierung in ein Meta-Tag ein:
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
Alternativ können Sie versuchen, in einer anderen Codierung (vorzugsweise UTF-8) aus der Datenbank zu lesen oder den Text mit zu konvertieren
iconv()
.quelle
header("Content-Type: text/plain; charset=ISO-8859-1");
seinheader("Content-Type: text/html; charset=ISO-8859-1");
?Dies ist ein Zeichensatzproblem. Als solches kann es auf vielen verschiedenen Ebenen schief gegangen sein, aber höchstwahrscheinlich sind die Zeichenfolgen in Ihrer Datenbank utf-8-codiert und Sie präsentieren sie als iso-8859-1. Oder umgekehrt.
Der richtige Weg, um dieses Problem zu beheben, besteht darin, Ihre Zeichensätze zu korrigieren. Die einfachste Strategie, da Sie PHP verwenden, ist die Verwendung von ISO-8859-1 in Ihrer gesamten Anwendung. Dazu müssen Sie Folgendes sicherstellen:
charset=iso-8859-1
header
.accept-charset
Attribut auch für Ihre<form>
Elemente angeben .Wenn Sie bereits Daten in Ihrer Datenbank haben, sollten Sie sich bewusst sein, dass diese wahrscheinlich bereits durcheinander sind. Wenn Sie sich noch nicht in der Produktionsphase befinden, wischen Sie einfach alles ab und beginnen Sie von vorne. Andernfalls müssen Sie einige Daten bereinigen.
Ein Hinweis zu Meta-Tags, da jeder falsch versteht, was er ist:
Wenn ein Webserver eine Datei (ein HTML-Dokument) bereitstellt, sendet er einige Informationen, die nicht direkt im Browser angezeigt werden. Dies wird als HTTP-Header bezeichnet. Ein solcher Header ist der
Content-Type
Header, der den Mimetyp der Datei (z. B.text/html
) sowie die Codierung (auch als Zeichensatz bezeichnet) angibt. Während die meisten Webserver einenContent-Type
Header mitcharset
Informationen senden , ist dies optional. Wenn es nicht vorhanden ist, interpretiert der Browser stattdessen alle Meta-Tags mithttp-equiv="Content-Type"
. Es ist wichtig zu wissen, dass das Meta-Tag nur interpretiert wird, wenn der Webserver den Header nicht sendet. In der Praxis bedeutet dies, dass es nur verwendet wird, wenn die Seite auf der Festplatte gespeichert und von dort aus geöffnet wird.Diese Seite enthält eine sehr gute Erklärung dieser Dinge.
quelle
Ich war auch mit diesem Problem konfrontiert. In der Zwischenzeit bin ich auf drei Fälle gestoßen, in denen es passiert ist:
substr ()
Ich habe
substr()
eine UTF8-Zeichenfolge verwendet, die UTF8-Zeichen schneidet, sodass die geschnittenen Zeichen nicht korrekt angezeigt werden konnten. Verwenden Siemb_substr($utfstring, 0, 10, 'utf-8');
stattdessen. Creditshtmlspecialchars ()
Ein weiteres Problem war die Verwendung
htmlspecialchars()
einer UTF8-Zeichenfolge. Das Update ist zu verwenden:htmlspecialchars($utfstring, ENT_QUOTES, 'UTF-8');
preg_replace ()
Zuletzt habe ich herausgefunden, dass
preg_replace()
dies zu Problemen mit UTF führen kann. Der Code$string = preg_replace('/[^A-Za-z0-9ÄäÜüÖöß]/', ' ', $string);
transformierte beispielsweise die UTF-Zeichenfolge "F (×) = 2 × -3" in "F 2 ". Das Update istmb_ereg_replace()
stattdessen zu verwenden .Ich hoffe, dass diese zusätzlichen Informationen dazu beitragen, solche Probleme zu beseitigen.
quelle
strtolower
Funktion. Alle Funktionen im PHP-HandbuchWie in früheren Antworten erwähnt, geschieht dies, weil Ihr Text in
iso-8859-1
Codierung oder einem anderen Format in die Datenbank geschrieben wurde .Sie müssen die Daten also nur konvertieren,
utf8
bevor Sie sie ausgeben.$text = “string from database”; $text = utf8_encode($text); echo $text;
quelle
Um sicherzustellen, dass Ihre MYSQL-Verbindung auf UTF-8 (oder latin1, je nachdem, was Sie verwenden) eingestellt ist, können Sie Folgendes tun:
$con = mysql_connect("localhost","username","password"); mysql_set_charset('utf8',$con);
oder verwenden Sie diese Option, um zu überprüfen, welchen Zeichensatz Sie verwenden:
$con = mysql_connect("localhost","username","password"); $charset = mysql_client_encoding($con); echo "The current character set is: $charset\n";
Weitere Informationen hier: http://php.net/manual/en/function.mysql-set-charset.php
quelle
Basierend auf Ihrer Beschreibung des Problems werden die Daten in Ihrer Datenbank mit ziemlicher Sicherheit als Windows-1252 codiert , und Ihre Seite wird mit ziemlicher Sicherheit als ISO-8859-1 bereitgestellt . Diese beiden Zeichensätze sind äquivalent, außer dass Windows-1252 16 zusätzliche Zeichen enthält, die in ISO-8859-1 nicht vorhanden sind, einschließlich linker und rechter geschweifter Anführungszeichen.
Vorausgesetzt, meine Analyse ist korrekt, besteht die einfachste Lösung darin, Ihre Seite als Windows-1252 bereitzustellen. Dies funktioniert, da alle Zeichen in ISO-8859-1 auch in Windows-1252 enthalten sind. In PHP können Sie die Codierung wie folgt ändern:
header('Content-Type: text/html; charset=Windows-1252');
Sie sollten jedoch unbedingt überprüfen, welche Zeichenkodierung Sie in Ihren HTML-Dateien und im Inhalt Ihrer Datenbank verwenden, und darauf achten, dass Sie konsistent sind, oder ordnungsgemäß konvertieren, wenn dies nicht möglich ist.
quelle
Ich habe mich dazu entschlossen, diese Zeichen aus der Zeichenfolge zu entfernen -
ini_set('mbstring.substitute_character', "none"); $text= mb_convert_encoding($text, 'UTF-8', 'UTF-8');
quelle
Fügen Sie diese Funktion Ihren Variablen hinzu utf8_encode ($ your variable);
quelle
Fügen Sie diesen Code einfach am Anfang der Seite ein.
<?php header("Content-Type: text/html; charset=ISO-8859-1"); ?>
quelle
Versuchen Sie dies bitte
mb_substr ($ description, 0, 490, "UTF-8");
quelle
Das wird dir helfen. Setzen Sie dieses innere
<head>
Etikett<meta charset="iso-8859-1">
quelle
Dies kann durch Unicode- oder andere Zeichensatz-Fehlanpassungen verursacht werden. Versuchen Sie, den Zeichensatz in Ihrem Browser zu ändern. In den Einstellungen sieht der Text OK aus. Dann geht es darum, wie Sie Ihren Datenbankinhalt in einen Zeichensatz konvertieren, den Sie für die Anzeige verwenden. (Dies kann tatsächlich nur das Hinzufügen einer utf-8-Zeichensatzanweisung zu Ihrer Ausgabe sein.)
quelle
Am Ende, nachdem ich meine Tabellen repariert hatte, war es, sie zu sichern und die Einstellungen auf utf-8 zurückzusetzen. Dann änderte ich meine Dump-Datei so, dass DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci meine Zeichensatzeinträge sind
Jetzt habe ich keine Probleme mit dem Zeichensatz mehr, da die Datenbank und der Browser utf8 sind.
Ich habe herausgefunden, was es verursacht hat. Es war die Webseite + Browser-Effekte auf die DB. Auf den Linux-Terminals (Ubuntu + Firefox) wurde die Datenbank in Latin1 codiert, wobei die Registerkarten festgelegt sind. Auf den Windows 10 + Edge-Terminals wurden die Einträge jedoch zwangsweise in utf8 codiert. Außerdem habe ich festgestellt, dass Windows 10 Probleme mit latin1 hat, also habe ich mich entschlossen, mich dem Wind zu beugen und alles auf utf8 umzustellen.
Ich dachte, es sei ein Windows 10-Problem, weil wir angefangen haben, Win 10-Terminals zu verwenden. Microsoft-Fehler verursachen also erneut Probleme. Ich weiß immer noch nicht, warum sich die Codierung in den Formularen ändert, da der Browser in Windows 10 den latein1-Zeichensatz anzeigt, aber wenn er in seiner utf8-Codierung angezeigt wird und ich die Datenanomalie erhalte. Aber unter Linux + Firefox funktioniert das nicht.
quelle
Das hat in meinem Fall funktioniert:
Ich verwandle das schwarze Diamantzeichen in ein Fragezeichen, damit Sie:
$text = str_replace('?', '', utf8_decode($text));
quelle
$text =
Abschnitt: Dies ändert alle Fragezeichen innerhalb der Zeichenfolge, nicht nur den DiamantenFügen Sie diese Zeilen einfach vor den Überschriften hinzu.
Das genaue Format der
.doc/docx
Dateien wird abgerufen:if(ini_get('zlib.output_compression')) ini_set('zlib.output_compression', 'Off'); ob_clean();
quelle
Sie können den Zeichensatz auch in Ihrem Browser ändern. Nur aus Debug-Gründen.
quelle
Die Verwendung des gleichen Zeichensatzes (wie hier vorgeschlagen) sowohl in der Datenbank als auch im HTML hat bei mir nicht funktioniert ... Da ich mich daran erinnere, dass der Code als HTML generiert wird, habe ich mich für den
"
(HTML-Code) oder den"
(ISO Latin-1) entschieden Code) in meinem Datenbanktext, in dem Anführungszeichen verwendet wurden. Dies löste das Problem und gab mir ein Anführungszeichen. Es ist merkwürdig zu bemerken, dass vor dieser Lösung nur einige der Anführungszeichen und Apostrophe nicht korrekt angezeigt wurden, während andere dies taten. Der spezielle Code funktionierte jedoch in allen Fällen.quelle
Ich habe den Code "Codierung erkennen" nach meiner Änderung der Sortierung in phpmyadmin ausgeführt und jetzt wird er als Latin_1 angezeigt.
Aber hier ist etwas, bei dem ich auf eine andere Datenanomalie in meiner Anwendung gestoßen bin und wie ich sie behoben habe:
Ich habe gerade eine Tabelle mit gemischter Codierung importiert (mit Diamant-Fragezeichen in einigen Zeilen und alle in derselben Spalte). Hier ist also mein Fixcode. Ich habe den utf8_decode-Prozess verwendet, der den undefinierten Platzhalter verwendet und anstelle des "Diamant-Fragezeichens" ein einfaches Fragezeichen zuweist. Dann habe ich str_replace verwendet, um das Fragezeichen durch ein Leerzeichen zwischen Anführungszeichen zu ersetzen. Hier ist der [Code]
include 'dbconnectfile.php'; //// the variable $db comes from my db connect file /// inx is my auto increment column /// broke_column is the column I need to fix $qwy = "select inx,broke_column from Table "; $res = $db->query($qwy); while ($data = $res->fetch_row()) { for ($m=0; $m<$res->field_count; $m++) { if ($m==0){ $id=0; $id=$data[$m]; echo $id; }else if ($m==1){ $fix=0; $fix=$data[$m]; $fix = utf8_decode($fix); $fixx =str_replace("?"," ",$fix); echo $fixx; ////I echoed the data to the screen because I like to see something as I execute it :) } } $insert= "UPDATE Table SET broke_column='".$fixx."' where inx='".$id."'"; $insresult= $db->query($insert); echo"<br>"; } ?>
quelle
Für globale Zwecke.
Anstatt jeden Text zu konvertieren, zu kodieren, zu dekodieren, lasse ich sie lieber so wie sie sind und ändere stattdessen die PHP-Einstellungen des Servers. Damit,
Lass die Diamanten
Wählen Sie im Browser im Ansichtsmenü "Textcodierung" und suchen Sie diejenige, mit der Sie Ihren Text richtig sehen können.
Bearbeiten Sie Ihre php.ini und fügen Sie hinzu:
default_charset = "ISO-8859-1"
oder anstelle von ISO-8859 diejenige, die zu Ihrer Textcodierung passt.
quelle
Wenn Sie Daten von irgendwoher extrahieren, sollten Sie Funktionen mit dem Präfix verwenden
md_FUNC_NAME
.Hatte das gleiche Problem, es hat mir geholfen.
Oder Sie finden den Code dieses Symbols und löschen diese Symbole mit regulärem Ausdruck.
quelle
Gehen Sie zu Ihrem phpmyadmin und wählen Sie Ihre Datenbank aus. Erhöhen Sie einfach die Länge / den Wert des Felds dieser Tabelle auf 500 oder 1000, um Ihr Problem zu lösen.
quelle