XHTMLforum

XHTMLforum (http://xhtmlforum.de/index.php)
-   Serveradministration und serverseitige Scripte (http://xhtmlforum.de/forumdisplay.php?f=80)
-   -   Suche PHP Funktion die URL Fähige Strings aus utf8 strings erzeugt (http://xhtmlforum.de/showthread.php?t=55672)

braindead 06.02.2009 18:54

Suche PHP Funktion die URL Fähige Strings aus utf8 strings erzeugt
 
Hi,
ich suche eine PHP Stringfunktion die UTF8 Strings Umwandelt in URL "Fähige" Strings.
Konkret nutze ich UTF8 Strings aus einer Datenbank um sie in als Teile von urls zu benutzen (die ich dann mittels rewrite Methoden auf dynamisch erstellte Dokumente weiterleite).
Mein Problem sind eigentlich zwei Probleme:
1. Kann ich die UTF8 Strings nicht unmanipuliert als url Bestandteile nutzen weil dort Sonderzeichen enthalten sind die die meisten Browser nicht unterstützen in urls, von Serverseitigen Problemen mal abgesehen. Deshalb brauche ich zunächst eine Umwandlung.
Die Umwandlung soll allerdings etwas spezifischer sein was mich zu meinem zweiten Problem führt:
2. Da diese generierten URLs unter anderen den Zweck erfüllen sollen das sie den Webseitenbesuchern als Erkennungs- oder Erinnerungshilfe dienen sollen, sollten die nicht unterstützten Zeichen natürlich nicht einfach beliebige Zeichen umgewandelt werden, ich hätte z.B. gerne: ä->ae oder wenn das nicht geht ä->a, aber auch zeichen wie: à, â, å usw. sollen in a und nicht in e oder so, ersetzt werden, weil damit für deutsche Besucher (und für die ist die Seite optimiert) noch eine gewisse Ähnlichkeit zu den originalen Zeichen erhalten bleibt.

Meine bisherige Methode, die Strings durch eine schar str-replaces zu jagen macht in sofern Probleme das ich immer wieder überraschend auf neue Abwandlungen von Buchstaben stoße die ich vorher nicht kannte. Man glaubt es kaum wie viele Möglichkeiten es gibt a, e usw. mit Strichen, Punkten, etc zu versehen.

Gumbo 06.02.2009 19:27

URL-konform ist bereits der Rückgabewert der rawurlencode()-Funktion. Bei UTF-8 würden sogar in der Adressfeld die kodierten Zeichen statt der Kodierungen angezeigt werden.

Da du das aber wohl nicht möchtest, könntest du die iconv()-Funktion nutzen, um die Nicht-ASCII-Zeichen durch eine Transliteration zu ersetzen:
PHP-Code:

iconv('UTF-8''ASCII//TRANSLIT'$str

Dadurch gehen aber eben alle Nicht-ASCII-Zeichen verloren. Eine Konvertierung wie du sie möchtest, müsste also vorher vorgenommen werden.

toscho 06.02.2009 19:28

Da es für so eine Umschreibung keine feste Norm gibt, die alle Fälle erfaßt, wirst du um eine manuell gepflegte Liste nicht herumkommen.

Ein str_replace() genügt: Die Funktion akzeptiert auch Arrays als Parameter.

braindead 06.02.2009 19:47

Zitat:

Zitat von Gumbo (Beitrag 421368)
URL-konform ist bereits der Rückgabewert der rawurlencode()-Funktion. Bei UTF-8 würden sogar in der Adressfeld die kodierten Zeichen statt der Kodierungen angezeigt werden.

Da du das aber wohl nicht möchtest, könntest du die iconv()-Funktion nutzen, um die Nicht-ASCII-Zeichen durch eine Transliteration zu ersetzen:
PHP-Code:

iconv('UTF-8''ASCII//TRANSLIT'$str

Dadurch gehen aber eben alle Nicht-ASCII-Zeichen verloren. Eine Konvertierung wie du sie möchtest, müsste also vorher vorgenommen werden.

Inwiefern gehen mir hier die nicht ASCII Zeichen verloren? Laut beschreibung der Funktion würde bei obiger Anwendung die UTF-8 Zeichen durch ähnliche ASCII Zeichen ersetzt werden, das ist ja genau das was ich will. Das diese Zuordnung nicht Injektiv ist stört mich nicht, da ich andere Methoden habe um den "reduzierten" String einer dynamisch generierten Seite zuzuordnen. Oder habe hier was falsch verstanden?

Gumbo 06.02.2009 20:37

Es sind eben nur ähnliche Zeichen und manche Zeichen können gar nicht überführt werden, was zu einer Fehlermeldung führt. Um das zu vermeiden, solltest du noch zusätzlich ein //IGNORE anfügen, also ASCII//TRANSLIT//IGNORE.

braindead 06.02.2009 20:48

Ok danke, ich werde mal ein paar Tests durchführen, und zur Not den String vorher schonmal mit str_replace überarbeiten (insbesondere um die deutschen Umlaute durch Doppelbuchstaben zu ersetzen) und den string erst danach mit iconv behandeln (um nicht berücksichtigte Sonderzeichen noch abfangen zu können)

Gumbo 06.02.2009 20:53

Wie gesagt: Du könntest die Zeichen ja auch direkt verwenden und müsstest nur noch die rawurlencode()-Funktion darauf anwenden.

braindead 06.02.2009 21:03

Hmm es scheint so als würde iconv bei angabe von //IGNORE die oben genannten Variationen von a (inklusive des deutchen ä) nicht ignorieren sondern durch ? ersetzen. Ich denke nicht das es an meiner Darstellung liegt, denn die Seite wird als utf8 dokument geliefert und angezeigt und die utf8 Zeichen (die Variationen von a) werden korrekt angezeigt, nur der auch ausgegebene iconv behandelte String enthält nur "?". Soll das so sein oder kann das doch ein Darstellungsfehler sein?

EDIT: ich lese gerade das mein Problem irgentwie mit setlocale zusammenhängt. Keine Ahnung ob ich darauf Einfluss habe, mal schauen was das überhaupt ist :)

Gumbo 06.02.2009 21:12

Dann liegen die Daten wohl nicht in UTF-8 vor. Schau mal, was Folgedes ausgibt:
PHP-Code:

$str "\xC3\xA4"// entspricht UTF-8 ä (U+00E4)
echo $str// UTF-8-Ausgabe
echo utf8_decode($str); // ISO-8859-1-Ausgabe 

Ich wette, dass die Aussgabe wie folgt aussieht: „¤ä“.

braindead 06.02.2009 21:16

Zitat:

Zitat von Gumbo (Beitrag 421383)
Wie gesagt: Du könntest die Zeichen ja auch direkt verwenden und müsstest nur noch die rawurlencode()-Funktion darauf anwenden.

Das wäre ein Möglichkeit wenn ich mit iconv oder str_replace nicht auskomme. Mich stört hier nur die Umwandlung in %hexwert, ich empfinde das als wenig Ästetisch (inwieweit sowas überhaupt ein Rolle spielen sollte, ist ein anderes Thema :)). Zumindest merke ich gerade das mir iconv wohl ausscheidet, denn ich wage es nicht mit setlocale herumzuspielen. Dann werde ich wohl bei str_replace bleiben müssen.


Alle Zeitangaben in WEZ +2. Es ist jetzt 15:43 Uhr.

Powered by vBulletin® Version 3.8.11 (Deutsch)
Copyright ©2000 - 2024, vBulletin Solutions, Inc.

© Dirk H. 2003 - 2023