De:Tutorien:xajax und Zeichensätze






De:Tutorien:xajax und Zeichensätze

Deutsche Übersetzung | Startseite
xajax Version: 0.2 | Original

Contents

[edit] Einführung in Zeichensätze mit xajax

Eine der gegenwärtigen Problematiken mit AJAX-Technologien ist die Arbeit mit unterschiedlichen Zeichensätzen [character encoding --Anm. d. Ü.]. Das JavaScript XmlHttpRequest-Objekt, auf dem sämtliche asynchrone AJAX-Kommunikation aufbaut, sendet Daten lediglich im UTF-8-Zeichensatz ohne den Zeichensatz Ihrer HTML-Header und Ihres Seitencodes zu berücksichtigen.

Der Versuch, xajax-Funktionen auf einfache Weise mit von UTF-8 abweichenden Zeichensätzen zu verwenden, ist ein maßgebliches Entwicklungsproblem gewesen. Beginnend mit xajax Version 0.2.3 haben wir Funktionsweisen implementiert, die das Arbeiten mit Zeichensätzen unserer Hoffnung nach wesentlich stärker abstrahieren und einfacher zu schreibenden und zu wartenden Code ermöglichen.

Internationalisierungsprobleme können von Entwicklern optimal gelöst werden, indem sie ihre Internetseiten und Datenbanken rein auf dem UTF-8-Zeichensatz aufbauend planen und erstellen. UTF-8 sollte in der Lage sein, die benötigten Zeichen gleichgültig welcher Sprache anzuzeigen. xajax nutzt standardmäßig den UTF-8-Zeichensatz. Trotzdem verstehen wir, dass trotz dieses Ideals alter Code oder andere Umstände die Verwendung eines anderen Zeichensatzes erzwingen könnten.

Es gibt drei Wege, den von xajax verwendeten Zeichensatz vorzugeben:

[edit] Ändern des Standard-Zeichensatzes

In der xajax.inc.php-Datei ist eine Konstante XAJAX_DEFAULT_CHAR_ENCODING definiert. Standardmäßig ist sie auf den Wert UTF-8 gesetzt. Sie können hier jeden Zeichensatz angeben, den Sie benötigen, und xajax wird diesen anstelle des Standards verwenden.

//define ('XAJAX_DEFAULT_CHAR_ENCODING', 'utf-8' );
define ('XAJAX_DEFAULT_CHAR_ENCODING''ISO-8859-1' );

[edit] Ändern des Zeichensatzes während der Instantiierung

Sowohl der xajax-Klassenkonstruktor als auch der xajaxResponse-Klassenkonstruktor akzeptieren einen Parameter zum Überschreiben des Standard-Zeichensatzes für die erzeugte Instanz. Als Standard ist in beiden Fällen der Wert von XAJAX_DEFAULT_CHAR_ENCODING gesetzt.


Parameter des xajax-Konstruktors:

xajax($sRequestURI="",$sWrapperPrefix="xajax_",$sEncoding=XAJAX_DEFAULT_CHAR_ENCODING,$bDebug=false)


Parameter des xajaxResponse-Konstruktors:

xajaxResponse($sEncoding=XAJAX_DEFAULT_CHAR_ENCODING, $bOutputEntities=false)


Sie können xajax während der Instantiierung mitteilen, welcher Zeichensatz verwendet werden soll:

$xajax = new xajax("","xajax_",'ISO-8859-1');

Allerdings müssen Sie daran denken, den Zeichensatz der xajaxResponse-Objekte auf den gleichen Wert zu setzen:

$objResponse = new xajaxResponse('ISO-8859-1');

[edit] Ändern des Zeichensatzes nach der Instantiierung

Die Klassen xajax und xajaxResponse enthalten beide eine setCharEncoding()-Methode mit der der Zeichensatz nach dem Erstellen einer Klasseninstanz geändert werden kann:

$xajax = new xajax();
$xajax->setCharEncoding('ISO-8859-1');

Wenn Sie die setCharEncoding()-Methode verwenden, um den Zeichensatz des xajax-Objekts zu verändern, müssen Sie daran denken, auch den Zeichensatz der Instanzen der xajaxResponse-Klasse zu ändern; ansonsten wird xajax nicht ordnungsgemäß funktionieren. Sie können den xajaxResponse-Zeichensatz wie im vorherigen Abschnitt beschrieben während der Instantiierung anpassen oder die setCharEncoding()-Methode nach der Instantiierung verwenden:

$objResponse = new xajaxResponse();
$objResponse->setCharEncoding('ISO-8859-1');

[edit] Falls das Setzen des Zeichensatzes nicht funktioniert

Wenn Sie noch immer Fehlermeldungen aufgrund ungültigen XML-Codes erhalten und Sie Ihre Zeichen nur anzeigen und nicht vergleichen oder manipulieren wollen (und Sie die mb_string-Extensions für PHP installiert haben), können Sie versuchen xajax->outputEntitiesOn() zu setzen.

outputEntitiesOn() teilt dem Respons-Objekt mit, spezielle Zeichen automatisch in HTML-Entitäten umzuschreiben, sodass Zeichen, die nicht Teil Ihres aktuellen Zeichensatzes sind, konvertiert werden. Zum Beispiel würde é zu é, was in Browsern gleich dargestellt würde.

[edit] Probleme bei der Entschlüsselung (Decoding) von Zeichensätzen

Selbst wenn Sie die oben genannten Methoden verwenden, um die Verschlüsselung von Zeichen auf einen anderen Zeichensatz zu setzen, wird das XmlHttpRequest-Objekt Daten immerzu als UTF-8 senden. Die Werte von Parametern, die per JavaScript zu mit xajax registrierten PHP-Funktionen übertragen werden, werden noch immer im UTF-8-Zeichensatz verschlüsselt sein.

Seit Version 0.2.3 enthält xajax eingebaute Routinen zur Konvertierung der in UTF-8 empfangenen Daten in den von Ihnen verwendeten Zeichensatz. Diese Funktion ist standardmäßig DEAKTIVIERT. Sie können Sie aktivieren, indem Sie die decodeUTF8InputOn()-Methode der xajax-Klasse aufrufen:

$xajax = new xajax();
$xajax->setCharEncoding('ISO-8859-1');
$xajax->decodeUTF8InputOn();

Ist die Entschlüsselungsfunktion aktiviert, sucht xajax nach verschiedenen Modulen in Ihrer PHP-Installation, die zum Konvertieren des Zeichensatzes fähig sein könnten, und gebraucht diese, wenn sie verfügbar sind. Sind sie es nicht, erhalten Sie eine Fehlermeldung. Wenn alles klappt, sollten die Werte der Parameter, die Ihre Funktionen erhalten, dem von Ihnen gesetzten Zeichensatz entsprechen.

[edit] Kurztipps

  • Versuchen Sie wenn möglich immer UTF-8 zu verwenden.
  • Wenn Sie den Zeichensatz im xajax-Konstruktor oder über die $xajax->setCharEncoding()-Methode ändern, denken Sie daran, ihn auch für alle xajaxResponse-Instanzen zu setzen. Wenn Sie den Zeichensatz der xajaxResponse-Instanzen nicht auf den gleichen Wert der xajax-Instanz setzen, erhalten Sie im Internet Explorer eine Fehlermeldung.
  • Ungeachtet des gesetzten Zeichensatzes werden von Ihrem JavaScript kommende Daten immer in UTF-8 verschlüsselt. Verwenden Sie die $xajax->decodeUTF8InputOn()-Methode, um die automatische Konvertierung von UTF-8 in den von Ihnen gesetzten Zeichensatz zu aktivieren.

[edit] Beispiel

<?php
require ('xajax.inc.php');

function testEncoding($strText)
{
        $objResponse = new xajaxResponse('ISO-8859-1');
        $objResponse->addAssign("div1","innerHTML",$strText);
    
        return $objResponse;
}

$xajax = new xajax();
$xajax->setCharEncoding('ISO-8859-1');
$xajax->decodeUTF8InputOn();

$xajax->registerFunction("testEncoding");

$xajax->processRequests();
?>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
    <?php
        $xajax->printJavascript();
    ?>
</head>

<body>
    <div id="div1"></div>

    <form id="form1" onsubmit="return false;">
        <input type="text" value="Español" id="text1" name="text1" />
        <input type="submit" value="Submit" onclick="xajax_testEncoding(xajax.$('text1').value);" />
    </form>
</form>
</body>
</html>