2008-12-17 15 views
38

Einige meiner Skripte verwenden unterschiedliche Kodierungen, und wenn ich versuche, sie zu kombinieren, ist das ein Problem geworden.Konvertiere utf8-Zeichen zu iso-88591 und zurück in PHP

Aber ich kann nicht die Codierung verwenden sie ändern, anstatt möchte ich die encodig des Ergebnisses von Skript A ändern, und verwenden Sie es als Parameter in Skript B.

Also: Gibt es eine einfache Möglichkeit, eine Zeichenfolge von UTF-8 in ISO-88591 in PHP ändern? Ich habe utf_encode und _decode angeschaut, aber sie tun nicht, was ich will. Warum gibt es keine "utf2iso()" - Funktion oder ähnliches?

Ich glaube nicht, dass ich Zeichen habe, die nicht im ISO-Format geschrieben werden können, also sollte das kein großes Problem sein.

+1

utf8_decode sollte genau dein utf2iso sein?!? – BlaM

+0

Es ist erwähnenswert, dass PHP weiterhin intern auf utf-8 umstellt, so dass alle Zeichenfolgen, die Sie wahrscheinlich von außerhalb kommen, sind. Stellen Sie cURL, Dateizugriffsfunktionen, Streams, PDO/MySQL oder eine andere API für den Zugriff auf externe Daten ein, um UTF-8 zu verwenden, so dass es bereits korrekt ist, wenn PHP es erhält. – Xeoncross

Antwort

100

Werfen Sie einen Blick auf iconv() oder mb_convert_encoding(). Nur nebenbei: warum nicht utf8_encode() und utf8_decode() für Sie arbeiten?

utf8_decode - Wandelt einen String mit ISO-8859-1 Zeichen codiert mit UTF-8 in Einbyte-ISO-8859-1

utf8_encode - kodiert eine ISO-8859- 1 Zeichenfolge in UTF-8

So wesentlichen

$utf8 = 'ÄÖÜ'; // file must be UTF-8 encoded 
$iso88591_1 = utf8_decode($utf8); 
$iso88591_2 = iconv('UTF-8', 'ISO-8859-1', $utf8); 
$iso88591_2 = mb_convert_encoding($utf8, 'ISO-8859-1', 'UTF-8'); 

$iso88591 = 'ÄÖÜ'; // file must be ISO-8859-1 encoded 
$utf8_1 = utf8_encode($iso88591); 
$utf8_2 = iconv('ISO-8859-1', 'UTF-8', $iso88591); 
$utf8_2 = mb_convert_encoding($iso88591, 'UTF-8', 'ISO-8859-1'); 

alle sollten das gleiche tun - mit utf8_en/decode() erfordert keine spezielle Erweiterung, mb_convert_encoding() erfordern ext/mbstring und iconv() erfordern ext/iconv.

+0

Danke für eine gute Antwort, und Sie und die anderen hier haben Recht: utf8_decode() scheint die Arbeit zu erledigen. Es muss einige Probleme mit Dateien oder meinem Browser gegeben haben. Zumindest kann ich die Fehler nicht mehr reproduzieren ... (Vielleicht habe ich etwas mit meinen Browser-Zeichensatz-Einstellungen falsch gemacht?) – qualbeen

+0

Nur um es festzuhalten: Ich war in einer solchen Situation, aber ich habe es bemerkt Die iconv wurde zweimal (verschachtelt) zur selben str var aufgerufen. Nachdem ich diesen ersten Anruf entfernt habe, funktioniert das wie ein Zauber. (utf8_decode und mb_convert_encondition wurden nicht verwendet) – colares

+0

Dieser Rat half mir, ein seltsames Problem zu lösen, bei dem eine UTF-8-Zeichenfolge ("Atlántico") zuerst wörtlich in ISO-8859-1 kodiert wurde (sah aus wie "Atlántico") und dann wurden diese Einzelbyte-Zeichen wieder in UTF-8 zurückgescannt (sahen genau gleich "Atlántico" aus, aber jedes Zeichen wurde dieses Mal UTF-8-codiert). utf8_decode() half, weil es die UTF-8-Zeichen in ihre literalen ANSI-Substitute entschlüsselte, die dann auf geheimnisvolle Weise richtig gelesen und als UTF-8-Zeichen angezeigt wurden. Macht es Sinn oder nicht? Hmm .. – Tyler

0

Sie müssen das iconv Paket verwenden, speziell die iconv Funktion.

5

Verwenden Sie zunächst keine anderen Kodierungen. Es führt zu einem Chaos, und UTF-8 ist definitiv die, die Sie überall verwenden sollten.

Chancen sind Ihre Eingabe ist nicht ISO-8859-1, aber etwas anderes (ISO-8859-15, Windows-1252). Um von diesen zu konvertieren, verwenden Sie iconv oder .

Trotzdem sollten utf8_encode und utf8_decode für ISO-8859-1 funktionieren. Es wäre nett, wenn Sie einen Link auf eine Datei oder eine uuencoded oder base64 Beispiel-Zeichenfolge, für die die Konvertierung fehlschlägt oder unerwartete Ergebnisse liefert, veröffentlichen können.

+0

iconv oder mb_convert_encoding? iconv erfordert die Kenntnis der Eingabecodierung, was möglicherweise nicht der Fall ist. – Benubird

+0

@Benubird Wenn Sie raten Codierung, werden Sie wahrscheinlich in noch schlimmere Probleme (jetzt ist es nicht leicht reproduzierbar, da es von der Häufigkeit der Zeichen abhängen kann). Aber du hast recht, 'mb_convert_encoding' gehört definitiv zu dieser Antwort. Hinzugefügt. – phihag

+1

"Vermeiden Sie eine andere Kodierung als UTF8" ist ein guter Ratschlag, aber manchmal ist das nicht möglich. Zum Beispiel versuchen wir, eine Integration von Drittanbietern zu ermöglichen, wo die Partei XML im Latin 1-Format verlangt. – GordonM

0

I verwendet:

function utf8_to_html ($data) { 
    return preg_replace(
     array (
      '/ä/', 
      '/ö/', 
      '/ü/', 
      '/é/', 
      '/à/', 
      '/è/' 
     ), 
     array (
      'ä', 
      'ö', 
      'ü', 
      'é', 
      'à', 
      'è' 
     ), 
     $data 
    ); 
} 
0

Ich benutze diese Funktion:

function formatcell($data, $num, $fill=" ") { 
    $data = trim($data); 
    $data=str_replace(chr(13),' ',$data); 
    $data=str_replace(chr(10),' ',$data); 
    // translate UTF8 to English characters 
    $data = iconv('UTF-8', 'ASCII//TRANSLIT', $data); 
    $data = preg_replace("/[\'\"\^\~\`]/i", '', $data); 


    // fill it up with spaces 
    for ($i = strlen($data); $i < $num; $i++) { 
     $data .= $fill; 
    } 
    // limit string to num characters 
    $data = substr($data, 0, $num); 

    return $data; 
} 


echo formatcell("YES UTF8 String Zürich", 25, 'x'); //YES UTF8 String Zürichxxx 
echo formatcell("NON UTF8 String Zurich", 25, 'x'); //NON UTF8 String Zurichxxx 

überprüfen meine Funktion in meinem Blog aus http://www.unexpectedit.com/php/php-handling-non-english-characters-utf8

-1
function parseUtf8ToIso88591(&$string){ 
    if(!is_null($string)){ 
      $iso88591_1 = utf8_decode($string); 
      $iso88591_2 = iconv('UTF-8', 'ISO-8859-1', $string); 
      $string = mb_convert_encoding($string, 'ISO-8859-1', 'UTF-8');  
    } 
} 
+4

Versuchen Sie, dem Code eine Erläuterung hinzuzufügen, um den Lernwert des Posts zu erhöhen. –

1

Meta-Tag in Kopf, als

gesetzt
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" /> 

Verwenden Sie den Link http://www.i18nqa.com/debug/utf8-debug.html, um die gewünschten Symbole zu ersetzen.

dann verwenden str_replace wie

$find = array('“', '’', '…', '—', '–', '‘', 'é', 'Â', '•', 'Ëœ', 'â€'); // en dash 
         $replace = array('“', '’', '…', '—', '–', '‘', 'é', '', '•', '˜', '”'); 
$content = str_replace($find, $replace, $content); 

Sein die Methode ich eine Menge verwenden und helfen. Vielen Dank!

0

In meinem Fall, nachdem Dateien mit Namen mit diesen Zeichen hochgeladen wurden, waren sie nicht einmal mit Filezilla sichtbar! Im Cpanel Dateimanager wurden sie mit angezeigt? (unter schwarzem Hintergrund). Und diese Kombination machte es korrekt im Browser angezeigt (HTML-Dokument ist West-codiert):

$dspFileName = utf8_decode(htmlspecialchars(iconv(mb_internal_encoding(), 'utf-8', basename($thisFile['path'])))); 
0

Es ist viel besser

$ value = mb_convert_encode ($ Wert zu verwenden, 'HTML-Entitäten , UTF-8 ');

Speziell, wenn Sie AJAX-Aufrufe für die Übermittlung von ISO-8859-1-Zeichen verwenden. Es funktioniert für Chinesisch, Japanisch, Tschechisch, Deutsch und viele weitere Sprachen.

0

Verwenden Sie html_entity_decode() und htmlentities().

$html = html_entity_decode(htmlentities($html, ENT_QUOTES, 'UTF-8'), ENT_QUOTES , 'ISO-8859-1'); 

htmlentities() formatiert Ihre Eingabe in UTF8 und html_entity_decode() Formate es ISO-8859-1 zurück.

Verwandte Themen