AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

[PHP/JS] Unicode-Problem

Ein Thema von alcaeus · begonnen am 14. Apr 2006 · letzter Beitrag vom 18. Apr 2006
Antwort Antwort
Seite 2 von 3     12 3      
Benutzerbild von alcaeus
alcaeus

Registriert seit: 11. Aug 2003
Ort: München
6.537 Beiträge
 
#11

Re: [PHP/JS] Unicode-Problem

  Alt 14. Apr 2006, 17:29
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

Greetz
alcaeus
Andreas B.
Die Mutter der Dummen ist immer schwanger.
Ein Portal für Informatik-Studenten: www.infler.de
  Mit Zitat antworten Zitat
Frickeldrecktuxer_TM
(Gast)

n/a Beiträge
 
#12

Re: [PHP/JS] Unicode-Problem

  Alt 14. Apr 2006, 18:30
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).
  Mit Zitat antworten Zitat
Benutzerbild von Flocke
Flocke

Registriert seit: 9. Jun 2005
Ort: Unna
1.172 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#13

Re: [PHP/JS] Unicode-Problem

  Alt 14. Apr 2006, 18:43
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
Volker
Besucht meine Garage
Aktuell: RtfLabel 1.3d, PrintToFile 1.4
  Mit Zitat antworten Zitat
Frickeldrecktuxer_TM
(Gast)

n/a Beiträge
 
#14

Re: [PHP/JS] Unicode-Problem

  Alt 14. Apr 2006, 18:54
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
  Mit Zitat antworten Zitat
Benutzerbild von alcaeus
alcaeus

Registriert seit: 11. Aug 2003
Ort: München
6.537 Beiträge
 
#15

Re: [PHP/JS] Unicode-Problem

  Alt 14. Apr 2006, 18:59
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
Andreas B.
Die Mutter der Dummen ist immer schwanger.
Ein Portal für Informatik-Studenten: www.infler.de
  Mit Zitat antworten Zitat
Benutzerbild von Flocke
Flocke

Registriert seit: 9. Jun 2005
Ort: Unna
1.172 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#16

Re: [PHP/JS] Unicode-Problem

  Alt 14. Apr 2006, 19:29
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);
Volker
Besucht meine Garage
Aktuell: RtfLabel 1.3d, PrintToFile 1.4
  Mit Zitat antworten Zitat
Benutzerbild von alcaeus
alcaeus

Registriert seit: 11. Aug 2003
Ort: München
6.537 Beiträge
 
#17

Re: [PHP/JS] Unicode-Problem

  Alt 14. Apr 2006, 22:22
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

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
Andreas B.
Die Mutter der Dummen ist immer schwanger.
Ein Portal für Informatik-Studenten: www.infler.de
  Mit Zitat antworten Zitat
Frickeldrecktuxer_TM
(Gast)

n/a Beiträge
 
#18

Re: [PHP/JS] Unicode-Problem

  Alt 14. Apr 2006, 22:35
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.
  Mit Zitat antworten Zitat
Benutzerbild von alcaeus
alcaeus

Registriert seit: 11. Aug 2003
Ort: München
6.537 Beiträge
 
#19

Re: [PHP/JS] Unicode-Problem

  Alt 14. Apr 2006, 22:41
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

Greetz
alcaeus
Andreas B.
Die Mutter der Dummen ist immer schwanger.
Ein Portal für Informatik-Studenten: www.infler.de
  Mit Zitat antworten Zitat
Frickeldrecktuxer_TM
(Gast)

n/a Beiträge
 
#20

Re: [PHP/JS] Unicode-Problem

  Alt 14. Apr 2006, 23:00
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?
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 3     12 3      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:17 Uhr.
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