Umlaute mit AJAX verwenden

Da wir Deutschen leider unbedingt eigene Buchstaben brauchen. Haben wir als Webentwickler, jetzt riesige Probleme mit Buchstaben wie ö, Ö, ä, Ä, ü, Ü oder ß.

Ich durfte mich heute, voller Elan, zwei Stunden lang mit dem Problem rumschlagen bis ich eine Lösung gefunden habe.

Das Problem war folgendes: Über ein Formular wurde Text eingegeben welcher dann per AJAX-Request an eine Seite geschickt wurde, die diesen dann in die Datenbank schrieb. Aber die Umlaute, wurde nicht maskiert. Und sahen dann so aus: B-NEUö. Nach ein paar Minuten Fehlersuche war mir dann klar, dass sie schon so durch den AJAX-Request kommen. Also musste das Problem beim jQuery Teil liegen.

2 Stunden lange habe ich dann recherchiert, bis ich in der PHP-Dokumentation ,in den Kommentaren (bei der Funktion urlencode(), auf eine Lösung stieß die ein ähnliches Problem löste.

Die Lösung lautet so:

Schon im JavaScript Teil (jQuery) wird der Name maskiert (escaped), dafür gibt es die JS-Funktion escape()

var name2 = escape($('.name').val());
		var id2 = $('.id85').html();

		$.ajax({
		    url: 'ajax/clubs_ajax.php',
			type: 'POST',
			data: 'edit=1&name='+name2+'&id='+id2,
		    success: function(a) {
			     var res = $('.ajax_container').html(a);
			     $('.js-container').html(a);
			}
		});

Der maskierte Text wird dann rüber geschickt per GET oder POST Methode.

Im PHP-Teil muss der maskierte Text dann wieder entschlüsselt werden und in die Datenbank geschrieben werden. Dazu hat der Kommentator eine PHP-Funktion geschrieben, die das richtig macht: uft8_urldecode().

Die Funktionsdeklaration sieht so aus:

function utf8_urldecode($str) {
    $str = preg_replace("/%u([0-9a-f]{3,4})/i","&#x\\1;",urldecode($str));
    return html_entity_decode($str,null,'UTF-8');;
  }	

Benutzt wird sie dann so:

$name = utf8_urldecode($_POST['name']);

Nun kann, mit der Variable weiter gearbeitet werden. Wenn die Variable mit ö in die Datenbank gespeichert werden soll, muss die Kollation, meiner Meinung nach, uft8_general_ci sein. Ich habe es mit anderen Kollationen aber nicht getestet.

Vielleicht kann ich mit diesem Artikel irgendjemanden helfen, sonst dient es mir nur als öffentliches Notizbuch.

Ich bin Kevin, und schreibe hier über Themen die sich von CSS über Designs bis zur testgetriebenen Entwicklung mit PHP erstrecken. Ich arbeite in einer kleinen Firma als PHP-Entwickler und entwickle dort PHP Backends für verschiedene Projekte vorallem mit Laravel. Privat betreibe ich noch diesen Blog und notesafe.

10 Kommentare Schreibe einen Kommentar

  1. Hallo! Vielleicht hast du eine Idee…
    Ich habe das Tutorial http://www.webgeekly.com/tutorials/how-to-dynamically-update-your-content-every-few-seconds/ umgesetzt.

    In meinem PHP-Skript frage ich eine MySQL-Datenbank ab, welche eine zufällige Zeile ausliest. Wenn ich die Skript-Datei im Browser öffne ist alles ok.

    Öffne ich aber die HTML-Datei mit dem jQuery/Ajax so wird das Sonderzeichen z.B. beim meinem Wort „tía“ als angezeigt.

    Wie könnte ich das lösen? Denke für deine Hilfe!

  2. Geht auch einfacher einfach mit der Javascript-Funktion „encodeURIComponent“ encoden und dann auf PHP-Seite mit „urldecode“ wieder zurück wandeln. 🙂

    Das funktioniert dann auch mit allen Sonderzeichen. 🙂

  3. Hi!
    Die Seite hat mir geholfen, aber man braucht gar nicht gleich eine neue Funktion schreiben.

    es geht auch mit
    $variable = urldecode(html_entity_decode (utf8_decode($_REQUEST[‚parameterName‘])));

    Das encode( ) im JS-Code braucht man natürlich immer noch.

  4. Ich muss mich korrigieren!
    Es funktioniert so:
    in javascript vor dem senden:
    var daten = encodeURIComponent(‚datenblabla‘);

    in php:
    $daten= html_entity_decode(utf8_decode(urldecode($_REQUEST[‚daten‘])));
    …verarbeiten..

    und wieder zum js:
    $response = json_encode(utf8_encode( $daten));

Schreibe einen Kommentar zu Christian Antworten abbrechen