Umlaut Problem mit php

Felix Weber

Angesehenes Mitglied
Hallo,

es ist immer wieder doof, wenn ich feststelle, dass es richtig gut wäre, wenn man PHP pogrammieren könnte!
wink.gif



Folgendes Problem:

Es werden Daten (Text) mit einem Formular gesendet:
CODE <form form="" action="verteiler.php" enctype="x-www-form-urlencoded" method="post" select="" name="form1" option="" value="web" style="margin: 0px;" />
<input id="suchwort" select="" name="suchwort" option="" class="textfield" style="width: 350px;" /></td>  
<input TYPE="hidden" NAME="doit" VALUE="1"/></td>  


das kommt dann an die verteiler.php und wird so weiterverarbeitet:


CODE <?php
$suchwort = $_POST['suchwort'];

if ( $_POST['doit']=="1" )
{


header("Location: index.php?feed=1&text=$suchwort");
exit;
}



Sope, funktioniert alles gut!
Nur aus der Eingabe "schön" wird dann "sch%F6n", was nicht schön ist!
biggrin.gif

ß und co funktionieren auch nicht!

Sope, ich habe schon versucht die Einagbe des Formular ala enctype= zu verändern, es hat aber nicht gebracht.
An der index.php kann nicht liegen, weils ohne geht!

Wäre echt cool, wenn ich von euch ein wenig Input/Hilfe bekommen könnte!

Danke!
 
QUOTE (Felix Weber @ Do 18.02.2010, 11:45)Nur aus der Eingabe "schön" wird dann "sch%F6n", was nicht schön ist!
biggrin.gif

ß und co funktionieren auch nicht!

%F6 als Hexadezimalzahl = 246 als Integer = Codepoint von ö

Nur ist das insofern falsch, weil das in der Url die UTF-8 - Codierung von ö sein müßte



Also %C3%B6

Das sieht zwar noch häßlicher aus, wird dann aber - weil das korrektes UTF-8 ist, vom Browser auch korrekt decodiert, sollte also in der PHP-Datei als korrektes UTF-8 - ö ankommen.
 
CODE
$suchwort = $_POST['suchwort'];



$suchwort = urldecode($_POST['suchwort']);

 
QUOTE (empty @ Do 18.02.2010, 12:35)
CODE
$suchwort = $_POST['suchwort'];



$suchwort = urldecode($_POST['suchwort']);

Das muß doch erst einmal beim Aufruf codiert werden:

Es wird wohl eine urlencode-Funktion geben. Damit:


CODE header("Location: index.php?feed=1&text=" . urlencode($suchwort));



Dann erhält der Webserver in der Url eine korrekte UTF-8 - Codierung und kann diese an das verarbeitende Script weiterreichen.
 
Hey danke erstmal für eure Hilfe!

Habe es so verändet, wie gesagt:

oben

CODE $suchwort = urldecode($_POST['suchwort']);


und dann unten


CODE header("Location: index.php?feed=1&text=" . urlencode($suchwort));



Leider hat sich nichts geändert!
Aus "Häuser" wird immernoch "H%E4user" statt "h%c3%a4user" !?
 
QUOTE lass das urlencode weg wink.gif


mmh

dann wird aus "öfen" immernoch nicht "%c3%b6fen" sondern nur "%f6fen"
ohmy.gif


Und in der index.php wohin das weitergeleitet wird, gibt es auch noch ein urlencode!
 
Setzte doch mal utf8 in den Header, falls noch nich geschehen!?
 
QUOTE (Felix Weber @ Do 18.02.2010, 16:51) Aus "Häuser" wird immernoch "H%E4user" statt "h%c3%a4user" !?

Das Problem sehe ich darin, daß ich nicht sehe, wo das zu H%E4user wird.


Bsp.: Ist die eigentliche PHP-Datei mit dem Formular als UTF-8 gespeichert?

Neulich bin ich mal wieder reingefallen: In einer JavaScript-Datei hatte ich einen Umlaut stehen, die JavaScript-Datei war als ASCII abgespeichert - das hat nicht funktioniert, ein Ändern auf UTF-8 löste das Problem.


Schicke eventuell mal die Daten so etwa in zwei Stunden per POST an http://beispiel.server-daten.de/, schick mir aber eine Viertelstunde davor eine Mail (info @ sql-und-xml.de), damit ich die Trace-Liste rechtzeitig putze.

Dann sieht man erst einmal, was das das Formular abschickt.

Allerdings meine ich, daß jemand auch schon PHP-interne Techniken gepostet hatte, bsp. eine Ausgabe per echo, um zu sehen, was ankommt.
 
Hey,

entschuldige Jürgen!! Es tut mir wirklich Leid, dass ich nicht auf dein Angebot eingehen konnte, aber ich war leider kurzfristig verhindert!
Entschuldige!

Das Script schreibt selber die Daten in eine MySQL Datenbank und da finde ich "schön" als "schön" wieder!
Somit müsste das Problem ja beim letzten Script liegen oder?

Grüße Felix
 
Ich gehe hier mal einfach die Grundlagen der UTF-8-Zeichenkodierung durch für PHP, auch wenn einige Sachen bereits genannt wurden:


1.) Sicherstellen, dass die PHP-Dateien in UTF-8 gespeichert sind.


2.) Sicher stellen, dass die Seite auch in UTF-8 beim Browser erkannt wird.
CODE <?php

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

?><html>
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<!-- weiterer Code //-->



2.) Sicherstellen, dass die Daten auch in UTF-8 übergeben wurden (Angriffe auf das Script vermeiden)

CODE
// Code found: http://php.net/manual/en/function.mb-detect-encoding.php
// Returns true if $string is valid UTF-8 and false otherwise.
function is_utf8 ( $string )
{
   // From http://w3.org/International/questions/qa-forms-utf-8.html
   return preg_match('%^(?:
         [\x09\x0A\x0D\x20-\x7E]            # ASCII
       | [\xC2-\xDF][\x80-\xBF]             # non-overlong 2-byte
       |  \xE0[\xA0-\xBF][\x80-\xBF]        # excluding overlongs
       | [\xE1-\xEC\xEE\xEF][\x80-\xBF]{2}  # straight 3-byte
       |  \xED[\x80-\x9F][\x80-\xBF]        # excluding surrogates
       |  \xF0[\x90-\xBF][\x80-\xBF]{2}     # planes 1-3
       | [\xF1-\xF3][\x80-\xBF]{3}          # planes 4-15
       |  \xF4[\x80-\x8F][\x80-\xBF]{2}     # plane 16
   )*$%xs', $string);
} // function is_utf8

if ( !is_utf8($_POST['eingabe']) )
{
  exit();
}

Wenn ein Angriff stattfindet, ist die Script-Ausführung abzubrechen! Es wird maximal noch ein Report oder Log über den Angriff geschrieben. Nicht versuchen so was zu konvertieren oder zu säubern.


3.) Sicherstellen, dass die Datenverbindung mit dem entsprechenden Charset arbeitet, in dem entweder die Funktion mysql_set_charset('UTF-8'), oder mysqli_set_charset('UTF-8') verwendet wird. Hier nicht auf irgendwelche Krücken zurückgreifen, wie mysql_query('SET NAMES UTF-8') oder ähnliches.


4.) Sicherstellen, dass die Datenbank auch in UTF-8 speichert, nicht Latin-1 oder ähnliches. Die beste Kollation hierfür ist i.d.R. utf8_unicode_ci bei MySQL.


5.) URL-Dekodierung dann mittels urlrawdecode() bzw. urlrawencode() durchführen.


6.) Nach Möglichkeit Mbstring-Funktionen nutzen, für alle Arbeiten mit den Strings.


Wenn die Punkte befolgt werden, sollte es kaum noch Probleme mit der internen Kodierung geben.


PS: Denkt an die Filterung der einer solchen Eingabe, nicht das XSS-Angriffe auf das Script durchgeführt werden können, weil nur eine URL-Kodierung erfolgt und keine Eingabefilterung.
 
Haha herrlich sowas habe ich heute morgen gebraucht
biggrin.gif


Man kann es auch einfach halten um so einen Schwachsinn zu vermeiden:
QUOTE
<?php
header('Content-Type: text/html; charset=UTF-8');

?><html>
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<!-- weiterer Code //-->



1.) Dateien in einem Zeichensatz speichern und im ganzen Projekt bitte keine Sprünge mehr machen, dabei ists doch total egal ob UTF-8 oder ISO-xxxx-xx

2.) In deinem HTML Header den Content Type setzen.

3.) In deiner htaccess Datei den Content Type für PHP global setzen:
php_value mbstring.internal_encoding UTF-8
php_value mbstring.http_output UTF-8
php_value default_charset UTF-8
 
QUOTE (lerel @ Fr 26.02.2010, 09:56) Haha herrlich sowas habe ich heute morgen gebraucht
biggrin.gif


Man kann es auch einfach halten um so einen Schwachsinn zu vermeiden:
[...]

Wow, herrlich so einen blauäugigen Besserwisser braucht man wirklich, der meint die Dinge mit Servereinstellungen zu korrigieren, die der Programmierer verbockt, was vielleicht nicht mal möglich ist.
 
Bei mir funktioniert folgendes:

CODE header( "Content-Type: text/html; charset=UTF-8");
header( "Location: ".utf8_encode( $url));

 
Zurück
Oben