it-swarm.com.de

PHP Ausgabe mit kleinen schwarzen Diamanten mit Fragezeichen

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?

66

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.

66
user3850

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:

  • Alle PHP Quelldateien werden als iso-8859-1 gespeichert (nicht zu verwechseln mit cp-1252).
  • Ihr Webserver ist so konfiguriert, dass Dateien mit charset=iso-8859-1 bereitgestellt werden.
  • Alternativ können Sie die Einstellungen des Webservers innerhalb des PHP-Dokuments mit headerNAME _ überschreiben.
  • Außerdem können Sie ein Meta-Tag in Ihren HTML-Code einfügen , das dasselbe angibt, dies ist jedoch nicht unbedingt erforderlich.
  • Sie können auch das accept-charset -Attribut für Ihre <form> -Elemente angeben.
  • Datenbanktabellen werden mit der Codierung latin1 definiert
  • Die Datenbankverbindung zwischen PHP und database ist auf latin1 gesetzt

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.

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 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.

41
troelskn

Ich stand auch vor diesem Thema. Inzwischen bin ich auf drei Fälle gestoßen, in denen es passiert ist:

  1. 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

  2. htmlspecialchars () 

    Ein anderes Problem war die Verwendung von htmlspecialchars() in einer UTF8-Zeichenfolge. Das Update ist zu verwenden: htmlspecialchars($utfstring, ENT_QUOTES, 'UTF-8');

  3. 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.

26
Kai Noack

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;
8
Hamlet Kraskian

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

7
ptwiggerl

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.

6
Daniel Cassidy

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');
3
DropHit

Versuchen Sie es bitte

mb_substr ($ description, 0, 490, "UTF-8");

3
Vishal P Gothi

Fügen Sie diese Funktion Ihren Variablen hinzu Utf8_encode ($ your variable);

3
rk_programmer

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();
1
asma

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.

1
drtechno

Das wird dir helfen. Fügen Sie dies in <head>-Tag ein

<meta charset="iso-8859-1">
1
Prasant Kumar

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

1
che

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 &quot; (HTML-Code) oder den &#34; (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.

0
GrafixGuy

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>";
        }

        ?>        
0
drtechno

Sie können den Zeichensatz auch in Ihrem Browser ändern. Nur aus Debug-Gründen.

0
powtac

Fügen Sie diesen Code einfach am Anfang der Seite ein.

<?php
header("Content-Type: text/html; charset=ISO-8859-1");
?>
0
Harshil Kaneria

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.

0
Skylark Roman

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

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.

  1. Lass die Diamanten 
  2. Wählen Sie im Browser im Menü "Ansicht" "Textcodierung" aus und suchen Sie die, mit der Sie Ihren Text Richtig sehen können. 
  3. 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.

0
vivoconunxino