2009-07-27 20 views
23

das, was ich habe jetztEntfernen seltsame Zeichen von PHP-String

Zeichnung einen RSS-Feed in das PHP ist, die rohe xml aus dem RSS-Feed lautet:

Paul’s Confidence 

Die PHP, die ich so haben weit ist das.

$newtitle = $item->title; 
$newtitle = utf8_decode($newtitle); 

Das obige kehrt zurück;

Paul?s Confidence 

Wenn ich die utf_decode entfernen, erhalte ich diese

Paul’s Confidence 

Wenn ich ein str_replace versuchen;

$newtitle = str_replace("”", "", $newtitle); 

Es funktioniert nicht, ich bekomme;

Paul’s Confidence 

Irgendwelche Gedanken?

+0

In Ihrem ersten Code-Block geschrieben Sie ’ In Ihrem str_replace() Sie schrieb ” Ist das die Ergebnisse zu beeinflussen? – sshow

+4

Ich würde sagen, dass die Zeichencodierung der Seite, auf der Sie versuchen, die Zeichenfolge anzuzeigen, Ihr Ergebnis beeinflussen könnte ... ist die obige Ausgabe auf irgendeiner Webseite, auf die wir als Referenz schauen könnten (wenn ich lokal teste t bekommen keine funky output, nur ein einziges Zitat) –

+0

der Feed ist http: // claygroup.org/blog/feed/ @sshow war ein Tippfehler – mrpatg

Antwort

2

Ist die Zeichenkodierung für Ihre PHP-Server etwas anderes als UTF-8-Einstellung? Wenn ja, gibt es einen Grund oder könnte es zu UTF-8 geändert werden? Obwohl wir keine Daten in UTF-8 in unserer Datenbank speichern, habe ich festgestellt, dass das Setzen des Zeichensatzes des Webservers auf UTF-8 beim Lösen von Zeichensatzproblemen hilft.

Ich wäre daran interessiert, die Meinung anderer zu hören ... ob ich mich auf Probleme einstelle, indem ich den Webserver auf UTF-8 setze, während er gesendete Daten in Latin1 in unserer MySQL-Datenbank speichert. Ich weiß, dass es einen Grund gab, warum ich Latin1 für die Datenbank gewählt habe, aber ich kann mich nicht erinnern, was es war. Interessanterweise scheint unser derzeitiges Setup die Eingabe von nicht-UTF-8-Zeichen und das anschließende Rendern zu ermöglichen ... Es scheint, dass das Speichern in Latin1 die nachfolgende Decodierung und Anzeige aller UTF-8-Zeichen nicht verhindert.

9

Ich löste das Problem. Scheint eher eine kurze Lösung als das größere Problem zu sein, aber es funktioniert.

$newtitle = str_replace('’', "'", $newtitle); 

Ich fand auch dieses nützliche snippit, das anderen mit demselben Problem helfen kann;

<? 
$find[] = '“'; // left side double smart quote 
$find[] = 'â€'; // right side double smart quote 
$find[] = '‘'; // left side single smart quote 
$find[] = '’'; // right side single smart quote 
$find[] = '…'; // elipsis 
$find[] = '—'; // em dash 
$find[] = '–'; // en dash 

$replace[] = '"'; 
$replace[] = '"'; 
$replace[] = "'"; 
$replace[] = "'"; 
$replace[] = "..."; 
$replace[] = "-"; 
$replace[] = "-"; 

$text = str_replace($find, $replace, $text); 
?> 

Vielen Dank für Ihre Zeit und Rücksicht.

+0

Dies funktioniert jedoch nicht für eine Linux-Box, da die Codierung der 'php'-Datei unterschiedlich sein könnte und die Sonderzeichen nutzlos machen würde. Nur ein FYI. – Jakub

+0

Ja, das funktioniert nicht für mich. Was ist die Problemumgehung dafür? – vaichidrewar

+2

Sie müssen das 'â € "(rechtes doppeltes intelligentes Anführungszeichen) am Ende des Arrays setzen oder es passt zu allem, was mit â € | beginnt. – Zoot

6

Ja, das funktioniert nicht für mich. Was ist die Problemumgehung dafür?- vaichidrewar 12. März bei 22:29

Fügen Sie diese auf den HTML-Kopf (oder ändern, falls bereits vorhanden):

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

Dies wird die lustigen Zeichen wie "â € œ" codiert in UTF-8, so dass die str_replace() Funktion sie richtig interpretiert.

Oder Sie können dies tun:

ini_set('default_charset', 'utf-8'); 
0

Es ist nicht Sie müssen nicht funktioniert $ verwenden arr1 = str_split ($ str) dann foreach und echo ($ arr1 [$ k]) Dies zeigt Ihnen genau, welche Zeichen in die Zeichenfolge geschrieben werden.

15

Dies ist meine Funktion, die immer, unabhängig von der Codierung funktioniert:

function RemoveBS($Str) { 
    $StrArr = str_split($Str); $NewStr = ''; 
    foreach ($StrArr as $Char) {  
    $CharNo = ord($Char); 
    if ($CharNo == 163) { $NewStr .= $Char; continue; } // keep £ 
    if ($CharNo > 31 && $CharNo < 127) { 
     $NewStr .= $Char;  
    } 
    } 
    return $NewStr; 
} 

Wie es funktioniert:

echo RemoveBS('Hello õhowå åare youÆ?'); // Hello how are you? 
+0

Hölle Yeah! das funktionierte für mich :) Danke @David D – vijayrana

+0

Dies behält UTF8-Codierung nicht. – besimple

+0

Ich glaube nicht, dass es sollte - das heißt, Sie können nachher UTF-8 codieren oder die Funktion für Ihre eigenen Bedürfnisse ändern! –

2

Verwenden Sie den Code unten PHP

ein entfernen
html_entity_decode(mb_convert_encoding(stripslashes($name), "HTML-ENTITIES", 'UTF-8')) 
-1

Nur einfache Lösung.

wenn die Zeichenfolge diese Art von seltsamen Zeichen enthält suppose $text dann einige davon enthält wie unten gezeigt tun:

$mytext=mb_convert_encoding($text, "HTML-ENTITIES", 'UTF-8') 

und es wird funktionieren ..

0

Super-einfache Lösung ist es, Lassen Sie die Zeichen beim Laden der Seite dekodieren

Kopieren Sie einfach Folgendes am Anfang des Skripts

header('Content-Type: text/html; charset=UTF-8'); 

mb_internal_encoding('UTF-8'); 
mb_http_output('UTF-8'); 
mb_http_input('UTF-8'); 
mb_regex_encoding('UTF-8'); 

Referenz: http://php.net/manual/en/function.mb-internal-encoding.php Kommentar von webfav im Web links dot de

6

Damit werden alle Nicht-ASCII-Zeichen/Sonderzeichen aus einer Zeichenfolge entfernen.

//Remove from a single line string 
 
$output = "Likening ‘not-critical’ with"; 
 
$output = preg_replace('/[^(\x20-\x7F)]*/','', $output); 
 
echo $output; 
 
    
 
//Remove from a multi-line string 
 
$output = "Likening ‘not-critical’ with \n Likening ‘not-critical’ with \r Likening ‘not-critical’ with. ' ! -."; 
 
$output = preg_replace('/[^(\x20-\x7F)\x0A\x0D]*/','', $output); 
 
echo $output;

0
Please Try this. 


$find[] = '/&acirc;&#128;&#156;/' //'“'; // left side double smart quote 
$find[] = '/&acirc;&#128;&#157;/' //'â€'; // right side double smart quote 
$find[] = '/&acirc;&#128;&#152;/' //'‘'; // left side single smart quote 
$find[] = '/&acirc;&#128;&#153;/' //'’'; // right side single smart quote 
$find[] = '/&acirc;&#128;&#133/' //'…'; // elipsis 
$find[] = '/&acirc;&#128;&#150;/' //'—'; // em dash 
$find[] = '/&acirc;&#128;&#147;/' //'–'; // en dash 

$replace[] = '&ldquo;' // '"'; 
$replace[] = '&rdquo;' // '"'; 
$replace[] = '&lsquo;' // "'"; 
$replace[] = '&rsquo;' // "'"; 
$replace[] = '&#8943;' // "..."; 
$replace[] = '&mdash;' // "-"; 
$replace[] = '&ndash;' // "-"; 

$text = str_replace($find, $replace, $text);