php: ä zu ae ändern?

leo-magic

Aktives Mitglied
Thread Starter
Dabei seit
24.12.2004
Beiträge
1.178
Reaktionspunkte
4
Hallo,

Ich möchte in einem phpBB Forum den Username abfragen + Umlaute wie zB. ä in ae umändern.
PHP:
$username = $userdata['username'];
$username = str_replace("ä","ae",$username); 
$username = str_replace("ö","oe",$username); 
$username = str_replace("ü","ue",$username);

...funktioniert leider nicht...

Ist der Username zB. "Jörg" gibt $username immer noch "Jörg" aus.

PHP:
$username = "Jörg";
$username = str_replace("ä","ae",$username); 
$username = str_replace("ö","oe",$username); 
$username = str_replace("ü","ue",$username);

...funktioniert aber!!! $username ist dann korrekterweise "Joerg".

Woran liegt das?

Danke,
Léo
 
Encoding ist eine komplizierte Sache!

Es beginnt mit dem Encoding der Datenbank, geht weiter mit dem Encoding in dem der Webserver Daten ausgibt und Formulare einliest und es geht weiter mit dem Encoding das Du nutzt wenn Du Skripte schreibst! Die kurze und schlichte Antwort: Alle drei sollten das gleiche Encoding haben, wenn Du möglichst wenig Probleme haben willst!

Das Encoding von php und dem Webserver bekommst Du per phpinfo(); heraus. Bei der DB hängt es von der verwendeten Datenbank ab. Es gab da ein Beispiel für MySQL und UTF-8...ich suche mal...


EDIT: hier: http://www.gerd-riesselmann.de/softwareentwicklung/php-und-utf-8-eine-anleitung-einleitung
 
$username = iconv("UTF-8", "ASCII//TRANSLIT", $username);

funktioniert leider nicht. Gibt mir "J" aus, also schneidet alles weg ab dem ersten Umlaut...
Mit den Funktionen vom Link bin ich "leicht" überfordert...

Vielleicht kennt ja jemand gleich die Lösung...

Gruss,
Léo
 
echo mb_detect_encoding($username);
gibt dir das encoding aus, scheint ISO-8859-1 zu sein, sonst würde der nicht abschneiden ;)
bei mir gibt der aber auch nicht oe aus, sonder "o
 
gibt UTF-8 aus! und nun?

EDIT:

Habe alles probiert, nichts scheint zu klappen... Hauptsächlich geht es um die Umlaute ö, ä, ü, é usw... Wieso wird alles danach abgeschnitten?
ASCII//IGNORE funktioniert und löscht das Sonderzeichen einfach weg.

Léo
 
Zuletzt bearbeitet:
fang doch mal vorne an :)

- welche Codierung hat Dein Webserver ?
- welche Codierung hast Du für Deine Skripte verwendet?
- welche Codierung verwendet Deine Datenbank?
 
Also...

Der Server hat laut phpinfo ISO-8859-1.
Die Scripte -> ???
Die Datenbank laut mySQL Admin cp1252 West European (latin1) (Collation: latin1_swedish_ci)

Hilft das weiter?

Léo
 
Die Scripte -> ???
Die HTML/PHP Seiten -> <meta http-equiv="content-type" content="text/html; charset=...">

Wenn du hier z.B. UTF eingestell hast, beißt sich die PHP Ausgabe in Westeuropäisch mit der Codierung auf die der Browser mit dem Metatag eingestellt wird. Wobei das für die reine Skriptverarbeitung wurscht ist. Das kommt nur zum Tragen wenn du Daten per post an das Skript sendest.

In ASP gibt es zusätzlich noch eine Möglichkeit, der Skriptengine zur Laufzeit mitzuteilen, welche Codepage sie verwenden soll. Am Server selbst kann also Westeuropäisch eingestellt sein, im Seitenkopf kannst du aber z.B. UTF festlegen. Ich denke, in PHP sollte es da eine ähnliche Direktive geben.
 
Ok... Script ist auch iso-8859-1
In dem Fall liegt es an der Datenbank-Codierung??
 
Glaub ich eigentlich nicht. 1252 ist im Prinzip ISO-8859-1. 8859 ist eine Teilmenge von 1252. Latin1 in mysql entspricht also 8859 in php.

Das kann ich aber nur herleiten, weil ich selbst nicht mit mysql arbeite. Insofern gibt es eine geringe Chance, dass hier gleich jemand Einspruch ruft. :D

Wie ist denn die Seitencodierung der Webseite, mit der du die Daten absendest? Auch ISO-8859-1?
 
Also
$username = iconv("CP1252", "ASCII//TRANSLIT", $username);

ergibt schon mal eine kleine Besserung. Und zwar wird
Jörg -> J?rg

Immerhin nicht mehr abgeschnitten. Woran kann es sonst liegen??
 
Ich würde annehmen (ohne mich besonders gut mit PHP auszukennen), daß Du das *Skript* in Unicode speichern mußt, damit es funktioniert. Denn Du verwendest im Skript die Konstante "ö". Wenn das Skript als ISO... gespeichert ist, paßt das nicht auf ein Unicode-ö.

EDIT: Also im Editor, wo Du das Skript schreibst, einstellen, daß er die Datei als UTF-8 speichern soll. Die Information im meta-Tag muß natürlich dazu passen.
 
Also
$username = iconv("CP1252", "ASCII//TRANSLIT", $username);

ergibt schon mal eine kleine Besserung. Und zwar wird
Jörg -> J?rg

Immerhin nicht mehr abgeschnitten. Woran kann es sonst liegen??

du musst dann für iconv die richtige locale setzen, aber das wird dir auch kein anderes ergebnis bringen, weil die transliteration mit iconv doch nicht wie gewünscht funktioniert...
es macht halt dann "o aus dem ö...

funktioniert so was hier denn?
Code:
function cv_input($str){
      $out = "";
      for ($i = 0; $i<strlen($str);$i++){
           $ch= ord($str{$i});
           switch($ch){
                case 195: $out .= "";break;     
                case 164: $out .= "ae"; break; 
                case 188: $out .= "ue"; break; 
                case 182: $out .= "oe"; break; 
                case 132: $out .= "Ae"; break; 
                case 156: $out .= "Ue"; break; 
                case 150: $out .= "Oe"; break;
                default : $out .= chr($ch) ;
           }
      }
      return $out;
}


Ich würde annehmen (ohne mich besonders gut mit PHP auszukennen), daß Du das *Skript* in Unicode speichern mußt, damit es funktioniert. Denn Du verwendest im Skript die Konstante "ö". Wenn das Skript als ISO... gespeichert ist, paßt das nicht auf ein Unicode-ö.

klar, das ist schon wichtig, das script dann auch in der richtigen kodierung zu speichern.
aber was man da als input kriegt sollte man ja dann auch mal checken...
 
Ja, aber oben hat er doch geschrieben, daß mb_detect_encoding Unicode zurückliefert.

Seltsam finde ich das allerdings, weil Server und HTML-Datei angeblich ISO sind, dann sollte der Client doch ISO liefern und nicht Unicode, oder?

Da es aber eigentlich keinen Grund gibt, mit ISO-Strings zu arbeiten, würde ich sowieso auf Unicode umstellen. Dann könnte man sich die Konversion der Umlaute sparen. Wenn jemand André heißt, wird ja auch nicht konvertiert.
 
Deshalb fragte ich ja auch schon mehrfach nach der Quelle der Daten. Wenn der Username über eine Webseite angeliefert wird, die UTF codiert ist, kommt da eben UTF an und das beißt sich mit Latin.
 
Ujeh... also vielleicht mal für was das überhaupt sein muss:

Ich möchte den Username mittels $username = $userdata['username']; speichern und wie gesagt Umlaute ellimiminieren (zB. ö zu o), weil ich den Username für ein IRC Script als Chat-Nickname übenehmen will. (und IRC unterstützt keine Umlaute...)

@oneOeight: Würde das Script gerne ausprobieren, kannst Du mir aber dafür noch die Ref. Nr. für das Zeichen é geben? Danke!!
 
Zurück
Oben Unten