PHP PHP verkrüppelt Sonderzeichen in Variable bei Weiterreichung

AndrewPoison

Admiral
Registriert
Jan. 2005
Beiträge
8.521
Titel klingt ja mal wieder suppi :D

Hab ein kleines Problem (welches durch einen "Trick" zwar nicht mehr existent ist, aber jederzeit wieder auftauchen könnte wo ich nicht so einfach damit umgehen könnte).

Und zwar zeigt mit PHP eine kleine Macke bzgl. deutschen Sonderzeichen auf. So habe ich ein Skript das Zeile für Zeile eine normale Textdatei durchgeht (diese enthält unter anderem auch die Deutschen Umlaute etc.) auf diese weise ausgibt:

PHP:
echo htmlentities(trim($descriptions[$img]));
So klappt das Wunderbar. Sonderzeichen werden durch HTMLEntities kodiert zum Browser geschickt und alles funzt.

Nun hatte ich eine Funktion geschrieben (pDesc, erwartet 2 Parameter), die abhängig der gewählten Sprache der Website (kann man auf der Site auswählen, klappt diesbezüglich auch alles schon) nur den englischen oder deutschen Part der Zeile ausgibt. Die Funktion als solche macht ihre Arbeit gut. Aber dann:

PHP:
echo htmlentities(pDesc(trim($descriptions[$img]),$lng));
Rufe ich die Funktion so auf, werden Sonderzeichen als totaler Müll angezeigt. Erst dachte ich, dass meine Funktion dann wohl doch Fehler enthalten müsse und habe zu Debug-Zwecken jeden Code aus der pDesc-Funktion ausgeklammert und durch ein einfaches "echo $pD" ersetzt ($pD ist der erste Parameter, den die Funktion erwartet, wo der deutsche und englische Text drinnen stehen). Die Funktion macht also nun nichts anderes als den entgegengenommenen Wert (also die Texte) wieder auszuspucken.

Rufe ich wieder die Seite auf, stelle ich fest das der selbe Fehler mit den Sonderzeichen nachwievor vorhanden ist (auch mit Hard-Refreshes etc. probiert). Wie das? Hat PHP Probleme bei der Weiterreichung von Strings mit nicht-amerikanischen Zeichen?

"Gelöst" habe ich das Problem, indem ich meine Funktion eben erst zum Schluss aufrufe und HTMLEntities den Vortritt lasse - damit sind alle Sonderzeichen zum Zeitpunkt der Weitergabe an meine Funktion bereits in "normale" Zeichen umgewandelt, dass sieht dann im Aufruf so aus:

PHP:
echo pDesc(htmlentities(trim($descriptions[$img])),$lng);
Doch wie eingangs erwähnt - dass kann einem dann ja wohl auch noch an anderer Stelle passieren, wo es womöglich nicht so einfach ist die Aufrufreihenfolge zu ändern. Also - woran liegts? *wanna know* ^^
 
Zuletzt bearbeitet:
mach folgendes:

PHP:
echo htmlentities(pDesc(trim($descriptions[$img]),$lng)); 
echo $descriptions[$img];

und poste das ergebnis hier rein, sowie den kompletten code von pDesc


Das Problem wird wohl sein, dass die textdatei in einer anderen codierung geschrieben ist, als du sie ausliest.
die textdatei kannst du auch mal hier hochladen.
 
Test-Textdatei:

Text De-ü|Text Eng-ü
Funktion pDesc:

PHP:
function pDesc($pD,$lng) {
        $pDPart = explode("|", $pD);
        if($lng=="eng") { echo $pDPart[1]; } else { echo $pDPart[0]; }
    }
Funktion pDesc während des Debugs:
PHP:
function pDesc($pD,$lng) {
        /*$pDPart = explode("|", $pD);
        if($lng=="eng") { echo $pDPart[1]; } else { echo $pDPart[0]; }*/
        echo $pD;
    }
Ergebnis von "echo htmlentities(pDesc(trim($descriptions[$img]),$lng));":
"Text Eng-�" (zum Zeitpunkt war die Sprache auf Englisch, das passt also - nur der Umlaut ned ^^)

Ergebnis von "echo $descriptions[$img];":
"Text De-�|Text Eng-�"


Wie gesagt, beim Debug das gleiche (mal abgesehen davon, dass dann das erste Ergebnis auch beide Texte anzeigt, aber das hab ich ja auch ausgeklammert). Das Kuriose ist ja, dass ein Aufruf nur über "echo htmlentities(trim($descriptions[$img]));" funktioniert, also diese Funktionen bzw. diese Ausgabe hat keinerlei Probleme mit den Umlauten. Erst wenn ich das an meine Funktion weiterreiche, und dann sogar in dem Fall wo ich nichts mit den übergebenen Daten mache als sie wieder auszugeben. Das ist ja, was mich an der Stelle so fertig macht. Also selbst wenn ich die Datei mit einer anderen Kodierung einlesen als anzeigen würde, müsste die Ausgabe dann nicht unabhängig von meiner Funktion verkrüppelt aussehen (zumal, ich sags gerne nochmal, meine Funktion beim Debug ja nichts mit den Daten gemacht hat)?


/edit:

wenn ich aus:

PHP:
function pDesc($pD,$lng) {
        $pDPart = explode("|", $pD);
        if($lng=="eng") { echo $pDPart[1]; } else { echo $pDPart[0]; }
    }
ein

PHP:
function pDesc($pD,$lng) {
        $pDPart = explode("|", $pD);
        if($lng=="eng") { return $pDPart[1]; } else { return $pDPart[0]; }
    }
mache, also die Echos durch Returns ersetze, klappts so wie es ursprünglich sollte. Mh... Echo hat also hier irgendwo ein Problem mit dem Text, das würde auch erklären warum ein einfaches ausgeben des Textes mit "echo $pD" ebenfalls kacke ausschaut. Na gut... merk ich mir halt ;)
 
Zuletzt bearbeitet:
1) Ich brauch die Textdatei selbst, und nicht ein copy&paste von der textdatei
das copy&paste übernimmt teilweise intelligent die zeichencodierung

2) vergiss alles nach "echo $descriptions[$img];":
Der Fehler liegt offensichtlich daran, dass die Zeichenkodierung in der Textdatei anders ist, als die zeichencodierung, die du in php verwendest.
Dass das andere zufälliger weise interessiert mich ehrlich gesagt garnicht, und das seh ich mir garnicht an, weil vorher schon ein problem ist.. wenn das andere zufällig funktioniert ist das ja toll, aber in diesem falle uninteressant ;)


3) davon abgesehn hantierst du unnötiger weise selbst mit sprachabhängigen texten rum... warum das Rad 2 mal erfinden?
http://framework.zend.com/manual/en/zend.locale.html
 
Zuletzt bearbeitet:
PW-toXic schrieb:
3) davon abgesehn hantierst du unnötiger weise selbst mit sprachabhängigen texten rum... warum das Rad 2 mal erfinden?
http://framework.zend.com/manual/en/zend.locale.html

Weils Spaß macht :D ;) Ne, aber hab mich bezüglich dieser Zend_Locale-Geschichte noch nicht auseinander gesetzt, da ich bisher nie eine zweisprachige Website brauchte. Im übrigen treffen noch ein paar spezielle Dinge zu, die gegen dieses Framework und für meine "08/15"-Version sprechen ;)

Aber hast schon Recht, die Zeichenkodierung ist wohl schuld. Die Datei selbst liegt in ANSI vor (obwohl sie UTF seien sollte, ist wohl beim Upload was in die Quere gekommen), PHP lässt mit UTF-8 arbeiten. Nun, wo ich das Problem kenne, konnt ich es beheben ;)
 
Zurück
Oben