Ich schreibe ein PHP-Programm, das von einer Datenbankquelle abruft. Einige der Varchars enthalten Zitate, die als schwarze Diamanten mit einem Fragezeichen angezeigt werden ( , REPLACEMENT CHARACTER , gehe ich von Microsoft Word-Text aus).
Wie kann ich diese Zeichen mit php entfernen?
Wenn Sie dieses Zeichen sehen ( U + FFFD "REPLACEMENT CHARACTER"), bedeutet dies normalerweise, dass der Text selbst in einer Form der Einzelbyte-Codierung codiert ist, aber in einer der Unicode-Codierungen (UTF8 oder UTF16) interpretiert wird.
Wenn es andersherum wäre, würde es (normalerweise) ungefähr so aussehen:.
Wahrscheinlich ist die ursprüngliche Kodierung ISO-8859-1, auch als Latin-1 bekannt. Sie können dies überprüfen, ohne das Skript ändern zu müssen: Browser bieten die Möglichkeit, eine Seite in einer anderen Kodierung neu zu interpretieren - in Firefox verwenden Sie "Ansicht" -> "Zeichenkodierung".
Damit der Browser die richtige Kodierung verwendet, fügen Sie einen HTTP-Header wie folgt hinzu:
header("Content-Type: text/html; charset=ISO-8859-1");
oder fügen Sie die Kodierung 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 iconv()
konvertieren.
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 sicherstellen, dass:
charset=iso-8859-1
bereitgestellt werden.header
NAME _ überschreiben.accept-charset
-Attribut für Ihre <form>
-Elemente angeben.Wenn Ihre Datenbank bereits Daten enthält, sollten Sie sich darüber im Klaren sein, dass diese möglicherweise bereits fehlerhaft sind. Wenn Sie sich noch nicht in der Produktionsphase befinden, wischen Sie einfach alles ab und beginnen von vorne. Andernfalls müssen Sie einige Daten bereinigen.
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 Header Content-Type
, der den Mimetyp der Datei (z. B. text/html
) sowie die Codierung (auch als Zeichensatz bezeichnet) angibt. Während die meisten Webserver einen Content-Type
-Header mit charset
-Informationen senden, ist dies optional. Wenn es nicht vorhanden ist, interpretiert der Browser stattdessen alle Meta-Tags mit http-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 dann von dort geöffnet wird.
Diese Seite hat eine sehr gute Erklärung für diese Dinge.
Ich stand auch vor diesem Thema. Inzwischen bin ich auf drei Fälle gestoßen, in denen es passiert ist:
substr ()
Ich habe substr()
auf einer UTF8-Zeichenfolge verwendet, die UTF8-Zeichen ausschneidet. Daher konnten die Schnittzeichen nicht richtig angezeigt werden. Verwenden Sie stattdessen mb_substr($utfstring, 0, 10, 'utf-8');
. Credits
htmlspecialchars ()
Ein anderes Problem war die Verwendung von htmlspecialchars()
in einer UTF8-Zeichenfolge. Das Update ist zu verwenden: htmlspecialchars($utfstring, ENT_QUOTES, 'UTF-8');
preg_replace ()
Schließlich habe ich herausgefunden, dass preg_replace()
zu Problemen mit UTF führen kann. Der Code $string = preg_replace('/[^A-Za-z0-9ÄäÜüÖöß]/', ' ', $string);
hat beispielsweise die UTF-Zeichenfolge "F (×) = 2 × -3" in "F 2 " umgewandelt. Das Update ist stattdessen mb_ereg_replace()
.
Ich hoffe, diese zusätzlichen Informationen werden dazu beitragen, solche Probleme zu beseitigen.
Wie in früheren Antworten erwähnt, geschieht dies, weil Ihr Text in iso-8859-1
-Kodierung oder in einem anderen Format in die Datenbank geschrieben wurde.
Sie müssen also nur die Daten in utf8
konvertieren, bevor Sie sie ausgeben.
$text = “string from database”;
$text = utf8_encode($text);
echo $text;
Um sicherzustellen, dass Ihre MYSQL-Verbindung auf UTF-8 (oder latin1 (abhängig von der verwendeten Verwendung)) 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";
Mehr Infos hier: http://php.net/manual/de/function.mysql-set-charset.php
Aufgrund Ihrer Beschreibung des Problems werden die Daten in Ihrer Datenbank mit großer Wahrscheinlichkeit als Windows-1252 verschlüsselt, und Ihre Seite wird höchstwahrscheinlich als ISO-8859-1 bedient. Diese beiden Zeichensätze sind gleichwertig, mit der Ausnahme, dass Windows-1252 16 zusätzliche Zeichen enthält, die in ISO-8859-1 nicht enthalten sind, einschließlich linker und rechter geschweifter Anführungszeichen.
Unter der Annahme, dass meine Analyse korrekt ist, ist es die einfachste Lösung, Ihre Seite als Windows-1252 bereitzustellen. Dies funktioniert, da alle Zeichen, die in ISO-8859-1 enthalten sind, auch in Windows-1252 enthalten sind. In PHP können Sie die Kodierung folgendermaßen ändern:
header('Content-Type: text/html; charset=Windows-1252');
Sie sollten jedoch wirklich prüfen, welche Zeichenkodierung Sie in Ihren HTML-Dateien und den Inhalt Ihrer Datenbank verwenden, und darauf achten, dass sie konsistent sind oder ordnungsgemäß konvertieren, wenn dies nicht möglich ist.
Ich entschloss mich, diese Zeichen aus der Zeichenfolge zu entfernen, indem Sie Folgendes tun:
ini_set('mbstring.substitute_character', "none");
$text= mb_convert_encoding($text, 'UTF-8', 'UTF-8');
Versuchen Sie es bitte
mb_substr ($ description, 0, 490, "UTF-8");
Fügen Sie diese Funktion Ihren Variablen hinzu Utf8_encode ($ your variable);
Fügen Sie diese Zeilen vor den Kopfzeilen hinzu.
Das genaue Format der .doc/docx
-Dateien wird abgerufen:
if(ini_get('zlib.output_compression'))
ini_set('zlib.output_compression', 'Off');
ob_clean();
was ich am Ende getan habe, nachdem ich meine Tabellen repariert hatte, war das Sichern und Ändern der Einstellungen auf utf-8. Dann habe ich meine dump-Datei so geändert, dass DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci meine Zeichensatz-Einträge sind
jetzt habe ich keine Zeichensatzprobleme mehr, weil die Datenbank und der Browser utf8 sind.
Ich habe herausgefunden, was es verursacht hat. Es war die Webseite + Browser-Effekte in der DB. Auf den Terminals, die Linux (Ubuntu + Firefox) sind, wurde die Datenbank in latin1 codiert, wobei die Registerkarten festgelegt sind. Bei den Windows 10 + Edge-Terminals wurden die Einträge zwangsweise in utf8 codiert. Ich habe auch bemerkt, dass die Fenster 10 Probleme mit latin1 haben, also habe ich beschlossen, mich mit dem Wind zu beugen und alles in utf8 umzuwandeln.
Ich dachte mir, dass es sich um ein Windows 10-Problem handelte, da wir begonnen hatten, Terminals mit dem Namen Win 10 zu verwenden. Ich weiß immer noch nicht, warum sich die Kodierung in den Formularen ändert, da der Browser in Windows 10 den latein1-Zeichensatz anzeigt, aber wenn er in seiner utf8-Kodierung angezeigt wird und ich die Datenanomalie erhalte. aber in linux + firefox ist das nicht so.
Das wird dir helfen. Fügen Sie dies in <head>
-Tag ein
<meta charset="iso-8859-1">
Dies kann durch Unicode oder andere Nichtübereinstimmung der Zeichensätze verursacht werden. Versuchen Sie, den Zeichensatz in Ihrem Browser zu ändern. In den Einstellungen sieht der Text in Ordnung aus. Dann ist es eine Frage, wie Sie Ihren Datenbankinhalt in einen Zeichensatz konvertieren, den Sie für die Anzeige verwenden. (Dies kann tatsächlich nur die Anweisung utf-8 charset zu Ihrer Ausgabe hinzufügen.)
Die Verwendung des gleichen Zeichensatzes (wie hier vorgeschlagen) sowohl in der Datenbank als auch im HTML-Code hat für mich nicht funktioniert. Wenn ich mich daran erinnere, dass der Code als HTML generiert wird, entschied ich mich, den "
(HTML-Code) oder den "
(ISO Latin) zu verwenden -1 Code) in meinem Datenbanktext, in dem Anführungszeichen verwendet wurden. Dies löste das Problem und gab mir ein Anführungszeichen. Es ist seltsam 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.
Ich habe den Code zum Erkennen der Codierung nach meiner Kollatierungsänderung in phpmyadmin ausgeführt, und jetzt erscheint er als Latin_1.
aber hier ist etwas, auf das ich gestoßen bin, als ich eine andere Datenanomalie in meiner Anwendung sah und wie ich es behoben habe:
Ich habe gerade eine Tabelle mit gemischter Kodierung importiert (mit Diamant-Fragezeichen in einigen Zeilen und alle waren in derselben Spalte). Hier ist also mein Fix-Code. Ich habe den utf8_decode-Prozess verwendet, der den undefinierten Platzhalter verwendet und anstelle des "Diamanten-Fragezeichen" ein einfaches Fragezeichen setzt. Dann habe ich str_replace verwendet, um das Fragezeichen durch ein Leerzeichen zwischen Anführungszeichen zu ersetzen. 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>";
}
?>
Sie können den Zeichensatz auch in Ihrem Browser ändern. Nur aus Debug-Gründen.
Fügen Sie diesen Code einfach am Anfang der Seite ein.
<?php
header("Content-Type: text/html; charset=ISO-8859-1");
?>
Wenn Sie Daten von überall extrahieren, sollten Sie Funktionen mit dem Präfix md_FUNC_NAME
verwenden.
Hatte das gleiche Problem, es hat mir geholfen.
Oder Sie können den Code dieses Symbols finden und mit regexp diese Symbole löschen.
Das passierte in meinem Fall:
$text = utf8_decode($text)
Ich verwandle den schwarzen Diamanten in ein Fragezeichen, so dass Sie:
$text = str_replace('?', '', utf8_decode($text));
Für globale Zwecke.
Anstatt jeden Text zu konvertieren, zu verschlüsseln und zu dekodieren, lasse ich ihn lieber so, wie er ist, und ändere stattdessen die php-Einstellungen des Servers.
Bearbeiten Sie Ihre php.ini und fügen Sie Folgendes hinzu:
default_charset = "ISO-8859-1"
oder anstelle von ISO-8859 diejenige, die zu Ihrer Textcodierung passt.