Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   [PHP/JS] Unicode-Problem (https://www.delphipraxis.net/67433-%5Bphp-javascript%5D-unicode-problem.html)

alcaeus 14. Apr 2006 16:29

Re: [PHP/JS] Unicode-Problem
 
Zitat:

Zitat von alcaeus
Das Problem ist sozusagen "halbgeloest"

Oder auch nicht :(

Ich beschreibe jetzt nochmal genauer, was ich bis jetzt rausgefunden habe, und hoffe mal dass mir jemand weiterhelfen kann.

Ich habe bei einem Posting-Formular zwei Wege um es abzuschicken: einmal ueber AJAX, einmal ueber den "normalen" submit.
Die Seite um die es dabei geht, hat ISO-8859-1 als charset eingestellt; dies nur so als Information.

Wenn ich das Formular ueber AJAX absende, dann wird der Wert der textarea genommen und durch escape() gejagt. Dies macht aus '€' ein '%u20AC'. Anschliessend wird es per XMLHttpRequest-Objekt an den Server gesendet, und zwar mit Content-Type "application/x-www-form-urlencoded". Im PHP-Script nehme ich den String der reinkommt und jage ihn durch oben gepostete Funktion, der eigentlich dieses falsche JS-encodierte Unicode-Zeichen umwandeln sollte. Da kommt allerdings trotz utf8_decode() nur '€' raus, und das landet auch in der Datenbank.
Wenn ich das Formular hingegen ueber den ueblichen Weg absende, so kommt auch ein € beim PHP-Script an, dort muss ich nichts machen.

Und das stellt mich vor ein Raetsel: trotz utf8_decode() kriege ich nicht das richtige Zeichen raus; und natuerlich landet es deshalb auch falsch in der Datenbank.

Kann mir jemand einen Tipp geben? Ich steh ichgendwie voll aufm Schlauch :cry:

Greetz
alcaeus

Frickeldrecktuxer_TM 14. Apr 2006 17:30

Re: [PHP/JS] Unicode-Problem
 
Zitat:

Zitat von Frickeldrecktuxer_TM
Wenn in einem String die Zeichenfolge "%u20AC" auftaucht, ist das kein UTF-8, mit irgendwelchen Standard-Unicode-Schnickschnack-Funktionen wirst du da nicht weit kommen. "%u20AC" ist kein Zeichensatz oder eine Zeichenkodierung, sondern ein Mapping, genauer ein Escape-Sequenz, die Word-Zeichen (in dem Fall wohl UTF-16) auf Byte-Zeichensätze abbildet. Laut Dokumentation kommt die Funktion urldecode() nur mit %xx zurecht, also Byte-Zeichen, keine Word-Zeichen. Was du suchst ist eine Funktion, die UTF-16 in einen für PHP brauchbaren Zeichensatz umwandelt, oder eine Funktion die UTF-16-Strings in UTF-8-Strings transformiert (das ginge theoretisch auch in JavaScript, kommt drauf an, für was man einfacher eine fertige Funktion findet). Die UTF-(-Transformation findet sich im Unicode-Standard. Das Euro-Zeichen wäre Beispielsweise in UTF-8als 0xE282AC kodiert.

Ich weiß nicht, was du da mit dem Kaufmannsund und UTF8_decode() machst...

Der Fehler liegt hier auf der Seite eines kranken Mappings von JavaScript, da sollte man reparieren. Laut SelfHTML (http://de.selfhtml.org/javascript/ob...gig.htm#escape) sollte dein encode() ohnehin nur für ASCII-Zeichen funktionieren, daß er dir beim Euro-Zeichen überhaupt was ausgibt ist bereits (zumindest laut SelfHTML, es wird vielleicht irgendwo eine aktuellere Dokumentation geben) undefiniertes Verhalten. Das Beispiel zu encodeURI() sieht ganz brauchbar aus, oder besser: es verhält sich für den Beispielstring so, wie ich es erwarte (in einem Firefox 1.5 in einer UTF-8-Umgebung).

Flocke 14. Apr 2006 17:43

Re: [PHP/JS] Unicode-Problem
 
Zitat:

Zitat von alcaeus
Code:
function ajax_decode_formvars($var)
{
   return preg_replace('#%u([a-f0-9]{4,4})#ie', 'utf8_decode(\'&#x\\1;\');', $var);
}

Der Aufruf "utf8_decode(\'&#x\\1;\');" konvertiert nicht wirklich etwas, denn die Eingabe ist ja kein UTF8.

Du hast den UTF16-Hexadezimalcode (20AC) und musst das nach UTF8 "\xE2\x82\xAC" konvertieren. Muss man sich jetzt nur noch die Konvertierungsregeln ansehen (siehe unten) und eine entsprechende Routine schreiben, die statt utf8_decode aufgerufen wird.
Code:
U-00000000 - U-0000007F: 0xxxxxxx
U-00000080 - U-000007FF: 110xxxxx 10xxxxxx
U-00000800 - U-0000FFFF: 1110xxxx 10xxxxxx 10xxxxxx
U-00010000 - U-001FFFFF: 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
U-00200000 - U-03FFFFFF: 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
U-04000000 - U-7FFFFFFF: 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx

Frickeldrecktuxer_TM 14. Apr 2006 17:54

Re: [PHP/JS] Unicode-Problem
 
Zitat:

Zitat von Flocke
Du hast den UTF16-Hexadezimalcode (20AC)

Es kommt im Endeffekt aufs gleiche raus, aber es ist einfach die Unicode-Repräsentierung als Hexadezimalzahl ausgeschrieben, kein UTF-16 (sondern UCS ;-)).
Hätte die escape()-Funktion UTF-16 erzeugen wollen, würde nicht einfach die Hexadezimalzahl im String stehen (es sei denn die Implementierung ist sehr kaputt).
Ist zwar nur eine reine Formalität und ändert am Ergebnis nichts, aber soll doch zumindest mal erwähnt bleiben, wenn hier schon so viel Verwirrung um Zeichensätze und Zeichenkodierungen herrscht.

Ansonsten ist das ja genau das, was ich schon in meinem ersten Post geschrieben habe :zwinker:

alcaeus 14. Apr 2006 17:59

Re: [PHP/JS] Unicode-Problem
 
Ok, ich werde heute Abend noch mit encodeURI() sowie ein paar anderen Dingen herumspielen, und dann Bescheid sagen, obs auch funktioniert hat ;)

Danke fuer die Hilfe :)

Greetz
alcaeus

Flocke 14. Apr 2006 18:29

Re: [PHP/JS] Unicode-Problem
 
Zitat:

Zitat von Frickeldrecktuxer_TM
... aber soll doch zumindest mal erwähnt bleiben, wenn hier schon so viel Verwirrung um Zeichensätze und Zeichenkodierungen herrscht.

Recht hast du, mein Fehler.

Zurück zum Thema: so sollte es gehen:
Code:
function hex2utf8($str)
{
   $i = hexdec($str);
   if ($i < 0x80)
      return chr($i);

   $r = '';
   for ($x = 0x3f; $i > $x; $x >>= 1)
   {
      $r = chr(0x80 + ($i & 0x3f)) . $r;
      $i >>= 6;
   }

   return chr(0xfe - $x - $x + $i) . $r;
}

$str = preg_replace('#%u([a-f0-9]{4,4})#ie', 'hex2utf8(\'\1\');', $str);

alcaeus 14. Apr 2006 21:22

Re: [PHP/JS] Unicode-Problem
 
Zitat:

Zitat von Frickeldrecktuxer_TM
Das Beispiel zu encodeURI() sieht ganz brauchbar aus, oder besser: es verhält sich für den Beispielstring so, wie ich es erwarte (in einem Firefox 1.5 in einer UTF-8-Umgebung).

Naja, IE und Firefox machen aus € nur '%E2%82%AC', was natuerlich dazu fuehrt, dass drei sonderbare Zeichen anstatt dem Euro-Zeichen eingefuegt werden.

@Flocke: Deine Routine funktioniert so ungefaehr; In der XML-Datei sieht es teilweise richtig aus, in der Datenbank allerdings nicht wirklich :gruebel:

Ich werde aber nch ein bisschen damit rumspielen.

Greetz
alcaeus

PS: koennte mir evtl. jemand erklaeren, wie ich dieses Spezialformat umwandeln muss? Ich verstehe diese Tabelle nicht ganz :gruebel: :oops:

Frickeldrecktuxer_TM 14. Apr 2006 21:35

Re: [PHP/JS] Unicode-Problem
 
Zitat:

Zitat von alcaeus
Naja, IE und Firefox machen aus € nur '%E2%82%AC', was natuerlich dazu fuehrt, dass drei sonderbare Zeichen anstatt dem Euro-Zeichen eingefuegt werden.

Das ist UTF-8 mit Scaping. Jetzt brauchst du lediglich ein urldecode(), in dem das utf8_decode() schon integriert ist. Wie xaromz schon richtig bemerkte, die String-Funktionen von PHP sind nicht für UTF ausgelegt. Entweder Unicode, oder Escaping, beides gleichzeitig wird ziemlich ekelhaft. Aber jetzt hast du wenigstens etwas standardkonformes und nicht irgendwelchen zusammengefrickelten Müll, jetzt sollte es einfacher sein, eine fertige Funktion dafür zu finden.

alcaeus 14. Apr 2006 21:41

Re: [PHP/JS] Unicode-Problem
 
Ok...also:
ich jage die Zeichen jetzt durch encodeURI() anstatt escape()
Sobald die Daten beim Server ankommen, lasse ich ein urldecode() drueberlaufen. Anschliessend wird der Rueckgabewert gespeichert und zur Kontrolle an den Client zurueckgeschickt. Dort sehe ich ein Euro-Zeichen. In der Datenbank landet aber die Kombination "€" fuer €, und "é" fuer é (zweiteres wurde bei escape() korrekt eingetragen). Also so langsam verliere ich komplett den Ueberblick :roteyes:

Greetz
alcaeus

Frickeldrecktuxer_TM 14. Apr 2006 22:00

Re: [PHP/JS] Unicode-Problem
 
Zitat:

Zitat von alcaeus
In der Datenbank landet aber die Kombination "€" fuer €, und "é" fuer é (zweiteres wurde bei escape() korrekt eingetragen).

Ich habe jetzt nicht nach den Werten gesucht, aber é ist UTF-8-kodiert ebenfalls ein Zwei-Byte-Zeichen, weil es nicht im ASCII-Zeichensatz enthalten ist. Wenn die Zahlwerte stimmen ist es also erwartetes Verhalten.
Daß beim Zurücksenden an den Client dieser es richtig interpretiert, ist schonmal ein gutes Zeichen, denn jetzt gehen beim Hin- und Herkodieren keine Informationen mehr verloren (z.B. das Charset).
Ein- und Ausgabe geht also, jetzt musst du nur noch die Daten richtig konservieren. Funkt vielleicht die Datenbank durch eine eigene Zeichentranskodierung dazwischen, oder geschieht gar das Auslesen aus der Datenbank nach ISO-irgendwas oder ASCII/ANSI?


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:35 Uhr.
Seite 2 von 3     12 3      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz