![]() |
[PHP/JS] Unicode-Problem
So, nach erfolglosen zwei Stunden googeln (!) kapituliere ich nun endgueltig.
Ich lese in einem Form auf einer Website irgendwas ein, und schicke es dann mit Hilfe von JavaScript-Funktionen an ein php-Script (ja, wieder mal meine AJAX-Spielereien). Der String wird dabei vorher durch escape() gejagt. Nun ergibt sich folgendes Problem: wenn ein Sonderzeichen enthalten ist (wie z.B. €), dann wird dieses korrekt in Unicode escapt: %u20AC. Allerdings sieht PHP dies als den String %u20AC an, und betrachtet es nicht als Unicode :( Weiss jemand wie ich dieses Problem loesen kann? So langsam bringt es mich um meinen Verstand Greetz alcaeus |
Re: [PHP/JS] Unicode-Problem
|
Re: [PHP/JS] Unicode-Problem
Hallo alcaeus,
Sind alle Sonderzeichen betroffen oder funktioniert urldecode()/rawurldecode() nur bei manchen nicht? |
Re: [PHP/JS] Unicode-Problem
Hallo,
noch ein Tipp: PHP unterstützt kein Unicode. Gruß xaromz |
Re: [PHP/JS] Unicode-Problem
Hallo,
Zitat:
Zitat:
Zitat:
Greetz alcaeus |
Re: [PHP/JS] Unicode-Problem
Eventuell wirst du selbst parsen müssen.
Das sollte mit preg_replace in Verbindung mit dem Modifier e oder mit preg_replace_callback und einer Ersetzungstabelle sogar recht elegant gehen. Echte Unicode-Ausgabe geht dann wohl mit den utf8-Funktionen :gruebel: |
Re: [PHP/JS] Unicode-Problem
Ja, also eines habe ich bereits festgestellt:
die utf-8-Codierung von JS ist alles andere als richtig. Mit dieser Funktion schreibe ich mir das eben in Zeichen um:
Code:
Nur bleibt dann eben der Code (beim €-Zeichen eben €) im String liegen, und nicht das Euro-Zeichen selbst. Woran das liegt habe ich noch nicht rausgefunden und das Problem momentan beiseite gelegt (bis morgen eben....)
function ajax_decode_formvars($var)
{ return preg_replace('#%u([a-f0-9]{4,4})#ie', 'utf8_decode(\'&#x\\1;\')', $var); } Falls jemand weitere Tipps hat, nur her damit, ich wuesste nicht wo ich ansetzen sollte :( Greetz alcaeus |
Re: [PHP/JS] Unicode-Problem
Der Euro ist ja #128, also das erste Zeichen im erweiterten Zeichensatz. Das kommt mir sowieso komisch vor, ich glaube, da hat Microsoft auch was getürkt. (Nein, das ist kein MS-Bashing :roll:)
Was ist denn € für ein Index in welcher Tabelle? Konvertiert UTF8_decode evtl. nur das Low-Set? (du könntest es ja mal mit © / #169 oder ®/#174 versuchen) |
Re: [PHP/JS] Unicode-Problem
Zitat:
Zitat:
Zitat:
Zitat:
UTF8_(en)code() konvertiert zwischen ISO-8859-1 und UTF-8 hin und her. Wenn Das Eurozeichen bei dir 0x80 ist, benutzt du weder Unicode, noch ISO-8895-1, sondern irgendwelchen proprietären Müll (Windows-1252) und guckst damit in die Röhre. 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. |
Re: [PHP/JS] Unicode-Problem
Hallo frickeldingens (*g*),
ja, diese Funktion hab ich, und diese sieht eben wie folgt aus:
Code:
Dies funktioniert auch auf einer Testseite:
function ajax_decode_formvars($var)
{ return preg_replace('#%u([a-f0-9]{4,4})#ie', 'utf8_decode(\'&#x\\1;\');', $var); }
Code:
gibt mir anstandslos das €-Zeichen aus, sobald ich %u20ac als Parameter beim Seitenaufruf mitgebe (das Charset der Seite ist auf utf-8 gesetzt). Trotzdem funktioniert es im phpBB-Forum (diese AJAX-Spielereien sind eine Erweiterung dafuer) nicht.
if (isset($_GET['c']))
{ echo $_GET['c'] .' '; echo ajax_decode_formvars($_GET['c']) .' '; } Dies haengt entweder damit zusammen, dass irgendwo ein htmlspecialchars() zuviel daherkommt (es steht naemlich € drin), oder dass es einfach daran liegt, dass das XML-File, ueber das das Ergebnis zum Browser kommt als charset utf-8 eingestellt hat, die Seite, auf der angezeigt wird allerdings ISO-8859-1. Was genau es ist muss ich jetzt mal rausfinden :roll: Das Problem ist sozusagen "halbgeloest", irgendwo steckt der Wurm noch, aber wo, das muss ich erst rausfinden. Jedenfalls schon mal Danke fuer eure Hilfe :) Greetz alcaeus |
Re: [PHP/JS] Unicode-Problem
Zitat:
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 |
Re: [PHP/JS] Unicode-Problem
Zitat:
Der Fehler liegt hier auf der Seite eines kranken Mappings von JavaScript, da sollte man reparieren. Laut SelfHTML ( ![]() |
Re: [PHP/JS] Unicode-Problem
Zitat:
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 |
Re: [PHP/JS] Unicode-Problem
Zitat:
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: |
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 |
Re: [PHP/JS] Unicode-Problem
Zitat:
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); |
Re: [PHP/JS] Unicode-Problem
Zitat:
@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: |
Re: [PHP/JS] Unicode-Problem
Zitat:
|
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 |
Re: [PHP/JS] Unicode-Problem
Zitat:
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? |
Re: [PHP/JS] Unicode-Problem
Zitat:
Greetz alcaeus |
Re: [PHP/JS] Unicode-Problem
Zitat:
Zitat:
Code:
//----
U-00000800 - U-0000FFFF: 1110xxxx 10xxxxxx 10xxxxxx
+ 10 000010 101100 -------------------------- = 11100010 10000010 10101100 E2 82 AC Mist: da wird man abgelenkt und verpasst eine komplette Stunde :roll: |
Re: [PHP/JS] Unicode-Problem
Zitat:
Zitat:
Greetz alcaeus |
Re: [PHP/JS] Unicode-Problem
Zitat:
Die richtige Methode wäre eine Zeichensatzumwandlung in das Format, das die Datenbank gerade haben will und eine Rückumwandlung in ein Format, das du intern haben willst. Die Hinumwandlung sollte bereits der Datenbanklayer erledigen, das Zurückumwandeln im Idealfall auch, dafür müsste man der Datenbank aber mitteilen, in welchem Zeichensatz man den String haben will. Vielleicht ist es hier einfacher, auf ein Datenbankobjekt zurückzugreifen, daß keinerlei Umwandlung durchführt, sondern lediglich das speichert, was du der Datenbank übergibst. Mal über ein BLOB nachgedacht? (Auch wenn es sich hier eher um ein Binary Small Object handelt ;-)) |
Re: [PHP/JS] Unicode-Problem
Zitat:
Greetz alcaeus |
Re: [PHP/JS] Unicode-Problem
Zitat:
Vielleicht schickt der Browser es bei seiner HTTP-Anfrage in einem anderen Zeichensatz ab als du es über DOM ausliest und an das PHP-Script schickst? |
Re: [PHP/JS] Unicode-Problem
So, hat etwas laenger gedauert, aber ich musste erstmal das Fenster wechseln. Das kommt davon wenn man Scriptsprachen zum Fenster rauswirft, es vorher aber nicht oeffnet :wall:
Egal, zurueck zum Thema: Zitat:
Ich habs jetzt natuerlich auch mal mit encodeURI() versucht. Jetzt kommt der "korrekte" String fuer € raus: %E2%82%AC. Der Server interpretiert dies bei einem rawurldecode() allerdings als "€", also alle drei Teile getrennt. Da war mir die alte Variante ja noch fast lieber; die kann ich wenigstens erkennen und bearbeiten. Von anderer Seite gabs auch noch einen Tipp, dass ich auf Serverseite pack() verwenden sollte, aber die Verwendung der Funktion ist mir mehr als nur schleierhaft :( Hat jemand einen Rat fuer mich (abgesehen von "lass es sein" :lol:) Greetz alcaeus [add="ein paar stunden spaeter"]So, geht jetzt, mit einer haesslichen Kombination von Frickeleien :roll: Ich wandle dieses %u20AC-Dingens das ich vom Browser kriege in einen gueltigen String um. Landet zwar nicht ganz korrekt in der Datenbank, stoert mich zum jetztigen Zeitpunkt aber kein bisschen :roll: Hauptsache es funktioniert[/add] |
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:56 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz