php-resource



Zurück   PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr > Entwicklung > PHP Developer Forum
 

Login

 
eingeloggt bleiben
star Jetzt registrieren   star Passwort vergessen
 

 

 


PHP Developer Forum Hier habt ihr die Möglichkeit, eure Skriptprobleme mit anderen Anwendern zu diskutieren. Seid so fair und beantwortet auch Fragen von anderen Anwendern. Dieses Forum ist sowohl für ANFÄNGER als auch für PHP-Profis! Fragen zu Laravel, YII oder anderen PHP-Frameworks.

Antwort
 
LinkBack Themen-Optionen Thema bewerten
  #1 (permalink)  
Alt 10-11-2009, 20:50
sEeb
 Registrierter Benutzer
Links : Onlinestatus : sEeb ist offline
Registriert seit: Aug 2003
Beiträge: 135
sEeb ist zur Zeit noch ein unbeschriebenes Blatt
sEeb eine Nachricht über ICQ schicken
Standard Encoding Probleme

Hi zusammen,

ich versuche eine Benutzereingabe über MySQL zu verarbeiten, im HTTP Header habe ich angegeben, dass alles per UTF-8 gesendet werden soll (MySQL ist auch auf UTF-8 eingestellt). Klappt soweit auch, wenn man allerdings den Browser manuell auf ISO-8859-1 umstellt stürzt MySQL mit einer Fehlermeldung ab (Illegal mix of collations (latin1_german1_ci,IMPLICIT) and (utf8_general_ci,COERCIBLE)), bzw. in einem anderen Fall speichert MySql die Daten nur, bis zum ersten unbekannten Zeichen (z.B. ł wenn ISO-8859-2 im Browser eingestellt ist)

1. Jetzt habe ich versucht, über mb_detect_encoding($string) herauszufinden, in welchem Encoding die Daten gesendet werden. Dieser behauptet aber beispielsweise beim Text "après" immer es wäre UTF-8, was eine Konvertierung natürlich unmöglich macht. Wie bewerkstellige ich es, dass er erkennt, ob dieser String im Encoding UTF-8 oder ISO-8859-1 abgesendet wurde?

2. Oder gibt es ferner eine sichere Möglichkeit zu erzwingen, dass alles in UTF-8 gesendet wird?

3.
HTML-Code:
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
ist mir bekannt, hilft aber leider in diesem Fall nicht.

HTML-Code:
<form name="formular"  accept-charset="UTF-8">
habe ich noch entdeckt, aber erkennt das jeder Browser?

Ich würde mich freuen wenn mir jemand ein paar Hinweise, Tutorials oder Funktionen aufzeigen kann, die diese Probleme behandeln.
Mit Zitat antworten
  #2 (permalink)  
Alt 10-11-2009, 20:59
AmicaNoctis
  Moderatorin
Links : Onlinestatus : AmicaNoctis ist offline
Registriert seit: Jul 2009
Beiträge: 5.709
Blog-Einträge: 9
AmicaNoctis sorgt für eine eindrucksvolle AtmosphäreAmicaNoctis sorgt für eine eindrucksvolle Atmosphäre
Standard

Hallo,

wenn du den Browser manuell auf Latin-1 umstellst, übergehst du jegliche durch den Server oder den Seiteninhalt vorgeschlagene Codierungsangabe.

Was du machen kannst, ist, den Content-Type Request-Header auszulesen (dort steht drin, mit welchem Zeichensatz die Anfrage gesendet wurde) und die Anfrageentität mit mb_convert_encoding in jedem Falle zu UTF-8 umzuwandeln.

Gruß,

Amica
Mit Zitat antworten
  #3 (permalink)  
Alt 10-11-2009, 21:24
wahsaga
  Moderator
Links : Onlinestatus : wahsaga ist offline
Registriert seit: Sep 2001
Beiträge: 25.236
wahsaga befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von sEeb Beitrag anzeigen
wenn man allerdings den Browser manuell auf ISO-8859-1 umstellt stürzt MySQL mit einer Fehlermeldung ab (Illegal mix of collations (latin1_german1_ci,IMPLICIT) and (utf8_general_ci,COERCIBLE)),
Mach dir bitte klar, dass ein Absturz des MySQL-Servers und eine simple Fehlermeldung beim Durchführen einer Anfrage etwas ganz verschiedenes sind.

Zitat:
HTML-Code:
<form name="formular"  accept-charset="UTF-8">
habe ich noch entdeckt, aber erkennt das jeder Browser?
Sollte in aktuellen Browsern m.E. das gewünschte bewirken.
Selbst wenn es in veralteten Versionen oder Exotenbrowsern nicht funktioniert, dürfte der Vorteil überwiegen.
__________________
I don't believe in rebirth. Actually, I never did in my whole lives.
Mit Zitat antworten
  #4 (permalink)  
Alt 10-11-2009, 21:29
AmicaNoctis
  Moderatorin
Links : Onlinestatus : AmicaNoctis ist offline
Registriert seit: Jul 2009
Beiträge: 5.709
Blog-Einträge: 9
AmicaNoctis sorgt für eine eindrucksvolle AtmosphäreAmicaNoctis sorgt für eine eindrucksvolle Atmosphäre
Standard

Zitat:
Zitat von wahsaga Beitrag anzeigen
Sollte in aktuellen Browsern m.E. das gewünschte bewirken.
Selbst wenn es in veralteten Versionen oder Exotenbrowsern nicht funktioniert, dürfte der Vorteil überwiegen.
Selbst, wenn es funktioniert, hat das genau gar nichts mit dem Problem zu tun. Das Accept-Charset ist eine Bitte an den Server, eine entsprechende Antwortentität in dieser Codierung auszuliefern und beeinflusst auf keinen Fall die Anfragecodierung.
Mit Zitat antworten
  #5 (permalink)  
Alt 10-11-2009, 21:44
wahsaga
  Moderator
Links : Onlinestatus : wahsaga ist offline
Registriert seit: Sep 2001
Beiträge: 25.236
wahsaga befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von AmicaNoctis Beitrag anzeigen
Das Accept-Charset ist eine Bitte an den Server, eine entsprechende Antwortentität in dieser Codierung auszuliefern und beeinflusst auf keinen Fall die Anfragecodierung.
Oh doch, Gnädigste :-)

Wenn dir die Beschreibung in SELFHTML nicht reicht, dann kannst du es auch in der Spezifikation nachlesen.

(Du denkst hier gerade an Accept-Charset in einem anderen Zusammenhang, nämlich in der anderen Richtung.)
__________________
I don't believe in rebirth. Actually, I never did in my whole lives.
Mit Zitat antworten
  #6 (permalink)  
Alt 10-11-2009, 21:55
AmicaNoctis
  Moderatorin
Links : Onlinestatus : AmicaNoctis ist offline
Registriert seit: Jul 2009
Beiträge: 5.709
Blog-Einträge: 9
AmicaNoctis sorgt für eine eindrucksvolle AtmosphäreAmicaNoctis sorgt für eine eindrucksvolle Atmosphäre
Standard

Zitat:
Zitat von wahsaga Beitrag anzeigen
Oh doch, Gnädigste :-)(Du denkst hier gerade an Accept-Charset in einem anderen Zusammenhang, nämlich in der anderen Richtung.)
Sorry, du hast natürlich vollkommen Recht - auch bezüglich dessen, woran ich gedacht habe. Asche auf mein Haupt.
Mit Zitat antworten
  #7 (permalink)  
Alt 10-11-2009, 22:17
wahsaga
  Moderator
Links : Onlinestatus : wahsaga ist offline
Registriert seit: Sep 2001
Beiträge: 25.236
wahsaga befindet sich auf einem aufstrebenden Ast
Standard

OffTopic:
Zitat:
Zitat von AmicaNoctis Beitrag anzeigen
Asche auf mein Haupt.
Ihr Frauen immer mit eurem Haare Färben ...
__________________
I don't believe in rebirth. Actually, I never did in my whole lives.
Mit Zitat antworten
  #8 (permalink)  
Alt 11-11-2009, 01:08
sEeb
 Registrierter Benutzer
Links : Onlinestatus : sEeb ist offline
Registriert seit: Aug 2003
Beiträge: 135
sEeb ist zur Zeit noch ein unbeschriebenes Blatt
sEeb eine Nachricht über ICQ schicken
Standard

schonmal danke für die antworten

Zitat:
Zitat von AmicaNoctis Beitrag anzeigen
Hallo,

wenn du den Browser manuell auf Latin-1 umstellst, übergehst du jegliche durch den Server oder den Seiteninhalt vorgeschlagene Codierungsangabe.

Was du machen kannst, ist, den Content-Type Request-Header auszulesen (dort steht drin, mit welchem Zeichensatz die Anfrage gesendet wurde) und die Anfrageentität mit mb_convert_encoding in jedem Falle zu UTF-8 umzuwandeln.

Gruß,

Amica
naja ich stell da auch nix um sonder x-beliebige benutzer und das muss ich abfangen wie frage ich denn den Content-Type Request-Header ab? wo in php taucht das auf? in $_SERVER habe ich nichts sinnvolles gesehen

und dann noch was im selfhtml link von wahsaga steht:
Verwenden Sie nur eine einzige Kodierungsangabe im Attribut, keine Liste von mehreren Alternativen. Ein Browser ist nicht gezwungen, die "passendste" Kodierung zu verwenden, er kann auch einfach die allererste verwenden. Da die meisten Browser nicht mitsenden, welche Kodierung tatsächlich verwendet wurde, wäre es Ihnen unmöglich zu erkennen, welche Kodierung verwendet wurde. Bei nur einer eingetragenen Möglichkeit sind keine Zweifel möglich.

ärgerlich, habe dann mal versucht google zu überlisten udn verschiedene kombinationen ausprobiert, aber die lassen sich nicht überlisten ... komisch finde ich auch, dass php denkt es handelt sich um utf-8 und mysql denkt es ist latin-1 ....
Mit Zitat antworten
  #9 (permalink)  
Alt 11-11-2009, 01:46
AmicaNoctis
  Moderatorin
Links : Onlinestatus : AmicaNoctis ist offline
Registriert seit: Jul 2009
Beiträge: 5.709
Blog-Einträge: 9
AmicaNoctis sorgt für eine eindrucksvolle AtmosphäreAmicaNoctis sorgt für eine eindrucksvolle Atmosphäre
Standard

Zitat:
Zitat von sEeb Beitrag anzeigen
wie frage ich denn den Content-Type Request-Header ab? wo in php taucht das auf? in $_SERVER habe ich nichts sinnvolles gesehen
$_SERVER["CONTENT_TYPE"], aber bei Formularen senden die meisten Browser da keine charset-Angabe mit (Ich bin erst davon ausgegangen, dass jeder Browser das in jedem Fall tut, aber in meinem Projekt setze ich das ja mit AJAX selber, daher konnte ich auch darauf zugreifen.)

Zitat:
Zitat von sEeb Beitrag anzeigen
mysql denkt es ist latin-1 ....
Hast du mysql_set_charset() oder SET NAMES gesetzt, nachdem du die Verbindung geöffnet hast?
Mit Zitat antworten
  #10 (permalink)  
Alt 11-11-2009, 02:40
Benutzerbild von onemorenerd onemorenerd
  Moderator
Links : Onlinestatus : onemorenerd ist offline
Registriert seit: Mar 2005
Ort: Berlin
Beiträge: 9.471
onemorenerd wird schon bald berühmt werdenonemorenerd wird schon bald berühmt werden
Standard

Moment mal! Das Problem tritt doch nur auf, wenn ein Benutzer seinen Browser (wie auch immer) dazu zwingt, die Daten nicht mit dem accept-charset zu senden. Das sollte unmöglich sein! Auf diesen Fall würde ich also überhaupt nicht hinprogrammieren. Den Knall in MySQL fängt die generelle Fehlerbehandlung ab, die man immer haben sollte.

Die Spec sagt über accept-charset "This attribute specifies the list of character encodings for input data that is accepted by the server processing this form."
Sendet ein Client die Daten mit einem anderen Charset, muss er also davon ausgehen, dass der Server diese Daten gar nicht akzeptiert. Sie trotzdem hinzuschicken ist definitiv ein Fehler des Clients. Browser die sowas machen sind schlichtweg kaputt. Punkt.
Mit Zitat antworten
  #11 (permalink)  
Alt 11-11-2009, 11:04
sEeb
 Registrierter Benutzer
Links : Onlinestatus : sEeb ist offline
Registriert seit: Aug 2003
Beiträge: 135
sEeb ist zur Zeit noch ein unbeschriebenes Blatt
sEeb eine Nachricht über ICQ schicken
Standard

Die MySql Verbindung ist automatisch auf UTF-8 eingestellt, genauso wie alle Tabellen die Verwendet werden.

Zitat:
Moment mal! Das Problem tritt doch nur auf, wenn ein Benutzer seinen Browser (wie auch immer) dazu zwingt, die Daten nicht mit dem accept-charset zu senden. Das sollte unmöglich sein! Auf diesen Fall würde ich also überhaupt nicht hinprogrammieren. Den Knall in MySQL fängt die generelle Fehlerbehandlung ab, die man immer haben sollte.

Die Spec sagt über accept-charset "This attribute specifies the list of character encodings for input data that is accepted by the server processing this form."
Sendet ein Client die Daten mit einem anderen Charset, muss er also davon ausgehen, dass der Server diese Daten gar nicht akzeptiert. Sie trotzdem hinzuschicken ist definitiv ein Fehler des Clients. Browser die sowas machen sind schlichtweg kaputt. Punkt.
Das stimmt, aber leider kann ich mir das nicht leisten Wenn der Benutzer etwas abschickt, muss es auch im System landen, ganz gleich was er eingestellt hat

Also nochmal zurück zum Ursprung, eigentlich suche ich ja einen sicheren Weg für einen übergebenen String die Codierung herauszufinden, oder eine Funktion, die alles nach UTF-8 konvertieren kann, ohne dass man die Codierung kennt. Mit mb_convert_encoding() klappt das sehr gut, wenn ich das Encoding kenne, aber wie gesagt, wenn der String so einfach ist wie "après" kann mb_detect_encoding() nicht feststellen, ob es sich um ISO oder UTF handelt ... Spontan fällt mir ein, in einem hidden Feld verschiedene Zeichen mitzusenden, die man dann untersucht, um das Encoding herauszufinden, aber das ist auch irgendwie gehackt ...
Mit Zitat antworten
  #12 (permalink)  
Alt 11-11-2009, 20:22
wahsaga
  Moderator
Links : Onlinestatus : wahsaga ist offline
Registriert seit: Sep 2001
Beiträge: 25.236
wahsaga befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von sEeb Beitrag anzeigen
Das stimmt, aber leider kann ich mir das nicht leisten Wenn der Benutzer etwas abschickt, muss es auch im System landen, ganz gleich was er eingestellt hat
Warum?

Mindestanforderungen an den Client bis auf knapp über Fussbodenhöhe herunterzuschrauben, wird oft serverseitig erheblichen Zusatzaufwand erfordern.

Zitat:
Spontan fällt mir ein, in einem hidden Feld verschiedene Zeichen mitzusenden, die man dann untersucht, um das Encoding herauszufinden, aber das ist auch irgendwie gehackt ...
Wenn du nicht akzeptieren kannst/darfst/willst, per (ausgehandelter) Definition fehlerhafte Daten als solche zurückzuweisen* - dann wird dir ausser Hacks vermutlich nichts anderes übrig bleiben.

Aber auch dazu noch mal, Vorsicht: Es gibt keinen Weg zweifelsfrei festzustellen, in welcher Kodierung Daten vorliegen.


* Wobei noch zu überlegen wäre, unter welchem HTTP Statuscode man das macht.
  • 406 Not Acceptable
  • 412 Precondition Failed (den könnte man verwenden, wenn der Client mitgeteilt hat, in welcher Kodierung er seine Daten sendet, und man diese nicht akzeptieren kann)
  • 422 Unprocessable Entity (wenn die Kodierung nicht erkannt wurde, und es beim Speichern in der Datenbank wirklich deswegen Fehler gibt)
__________________
I don't believe in rebirth. Actually, I never did in my whole lives.
Mit Zitat antworten
  #13 (permalink)  
Alt 17-11-2009, 18:24
Gunah
 Registrierter Benutzer
Links : Onlinestatus : Gunah ist offline
Registriert seit: Oct 2009
Beiträge: 87
Gunah befindet sich auf einem aufstrebenden Ast
Standard

accept-charset wird vom IE auch dem achter? nicht unterstützt, soviel weiss ich noch
Mit Zitat antworten
  #14 (permalink)  
Alt 17-11-2009, 18:35
sEeb
 Registrierter Benutzer
Links : Onlinestatus : sEeb ist offline
Registriert seit: Aug 2003
Beiträge: 135
sEeb ist zur Zeit noch ein unbeschriebenes Blatt
sEeb eine Nachricht über ICQ schicken
Standard

Wenn man den Zusatzaufwand aber betreiben will oder muss, weil man auf die Besucher angewiesen ist führt da kein Weg dran vorbei

Ich habe aber noch eine Möglichkeit gefunden. Über JavaScript kann man das im Browser eingestellte Encoding abfragen und dann die übergebenen Werte entsprechend konvertieren ...
Mit Zitat antworten
  #15 (permalink)  
Alt 17-11-2009, 18:55
AmicaNoctis
  Moderatorin
Links : Onlinestatus : AmicaNoctis ist offline
Registriert seit: Jul 2009
Beiträge: 5.709
Blog-Einträge: 9
AmicaNoctis sorgt für eine eindrucksvolle AtmosphäreAmicaNoctis sorgt für eine eindrucksvolle Atmosphäre
Standard

Zitat:
Zitat von sEeb Beitrag anzeigen
Ich habe aber noch eine Möglichkeit gefunden. Über JavaScript kann man das im Browser eingestellte Encoding abfragen und dann die übergebenen Werte entsprechend konvertieren ...
Ich hätte Interesse zu erfahren, wie genau du das machst.

Bei vielen Seiten, die ich geprüft habe, war
theForm.acceptCharset == ""
theForm.encoding== ""
theForm.enctype== ""

Wo nimmst du es her?

Gruß,

Amica
Mit Zitat antworten
Antwort

Lesezeichen


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Google Base API, Probleme beim Encoding francosdad PHP Developer Forum 5 04-07-2009 19:17
PHP Encoding h-UrAnY PHP Developer Forum 24 16-06-2007 11:26
Encoding Problem Kno PHP Developer Forum 7 24-08-2006 14:26
Encoding der URL Luke PHP Developer Forum 3 03-04-2006 19:49
Encoding Problem bitesser PHP Developer Forum 3 04-01-2006 11:14

Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre 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 an


PHP News

ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlicht
ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlichtDie bekannte Marktplatzsoftware ebiz-trader ist in der Version 7.5.0 veröffentlicht worden.

28.05.2018 | Berni

Wissensbestand in Unternehmen
Wissensbestand in UnternehmenLebenslanges Lernen und Weiterbilden sichert Wissensbestand in Unternehmen

25.05.2018 | Berni


 

Aktuelle PHP Scripte

ADSMAN V3 - Werbe-Manager ansehen ADSMAN V3 - Werbe-Manager

ADSMAN V3 - mehr als nur ein Bannermanager! Banner, Textanzeigen und PagePeel Manager! Mit ADSMAN PRO haben Sie die Marketinglösung für eine effektive und effiziente Werbeschaltung mit messbaren Ergebnissen. Unterstützt werden Bannerformate in beliebi

25.10.2018 virtualsystem | Kategorie: PHP/ Bannerverwaltung
PHP News und Artikel Script V2

News schreiben, verwalten, veröffentlichen. Dies ist jetzt mit dem neuen PHP News & Artikel System von virtualsystem.de noch einfacher. Die integrierte Multi-User-Funktion und der WYSIWYG-Editor (MS-Office ähnliche Bedienung) ermöglichen...

25.10.2018 virtualsystem | Kategorie: PHP/ News
Top-Side Guestbook

Gästebuch auf Textbasis (kein MySQL nötig) mit Smilies, Ip Sperre (Zeit selbst einstellbar), Spamschutz, Captcha (Code-Eingabe), BB-Code, Hitcounter, Löschfunktion, Editierfunktion, Kommentarfunktion, Kürzung langer Wörter, Seiten- bzw. Blätterfunktion, V

22.10.2018 webmaster10 | Kategorie: PHP/ Gaestebuch
 Alle PHP Scripte anzeigen

Alle Zeitangaben in WEZ +2. Es ist jetzt 17:04 Uhr.