"We are back" « oc.at

Zeichensatzprobleme Apache/PHP

Obermotz 01.03.2010 - 15:27 1747 9
Posts

Obermotz

Fünfzylindernazi
Avatar
Registered: Nov 2002
Location: OÖ/RI
Posts: 5262
Hi!

Wir haben hier bei einem Projekt Schwierigkeiten mit dem Zeichensatz. In generierten PDF-Files (fpdf) und gesendeten Emails werden UTF8-Relevante Sonderzeichen (aus der DB und aus den i18n-files) nicht korrekt angezeigt - ü statt Ü zum Beispiel.
Komischerweise tritt das Problem nur auf einem Server auf (blöderweise der des Kunden^^), der aber exakt die gleichen Configs hat wie unsere Entwicklungsserver.
System ist ein CentOS52 mit Apache22 und PHP53.

Hatte schon mal jemand ein ähnliches Problem?

tia

COLOSSUS

Administrator
GNUltra
Avatar
Registered: Dec 2000
Location: ~
Posts: 12211
Ja, massig. Woher kommen die Zeichen? MySQL? Ist dort die (Default) Collation der Tabelle bzw. Datenbank richtig eingestellt? Sind die Daten dort auch garantiert UTF-8-kodiert abgelegt worden? Hat der Server die von euch benoetigte Locale ueberhaupt installiert? Gibt's sicher kein Charset-Override in der (globalen oder VHost-spezifischen) Apache-httpd-Konfiguration?

Wenn das Problem wirklich nur bei generierten PDFs und versandten Mails auftritt, ist die Apache-Config wohl nicht schuld. Welche Locales haben die beiden Server denn als default im Environment? Wie sehen die Header von versandten Mails (sowohl von eurem Dev-, als auch vom Produktiv-Server) aus?

Dieses fpdf-Zeug macht sich in den FAQ uebrigens selbst derb madig: http://www.fpdf.org/en/FAQ.php#q7

Obermotz

Fünfzylindernazi
Avatar
Registered: Nov 2002
Location: OÖ/RI
Posts: 5262
Hmm, hab das Problem mittlerweile auch auf einem anderen Server auf dem Ubuntu läuft. Hab jetzt herumgewerkelt und hab die locale folgendermaßen konfiguriert:
LANG=de_AT.UTF-8
LANGUAGE=de_AT.UTF-8
LC_CTYPE="de_AT.UTF-8"
LC_NUMERIC="de_AT.UTF-8"
LC_TIME="de_AT.UTF-8"
LC_COLLATE="de_AT.UTF-8"
LC_MONETARY="de_AT.UTF-8"
LC_MESSAGES="de_AT.UTF-8"
LC_PAPER="de_AT.UTF-8"
LC_NAME="de_AT.UTF-8"
LC_ADDRESS="de_AT.UTF-8"
LC_TELEPHONE="de_AT.UTF-8"
LC_MEASUREMENT="de_AT.UTF-8"
LC_IDENTIFICATION="de_AT.UTF-8"
LC_ALL=

Sehr komisch allerdings, der Apache zeigt nach wie vor keine Umlaute an - außer die Daten kommen aus der Datenbank.

edit: solved.
Bearbeitet von Obermotz am 31.03.2010, 15:44

COLOSSUS

Administrator
GNUltra
Avatar
Registered: Dec 2000
Location: ~
Posts: 12211
Und wie?

Smut

takeover&ether
Avatar
Registered: Feb 2003
Location: VIE
Posts: 16867
ev. war folgendes in der httpd/apache2.config auskommentiert:
AddDefaultCharset ISO-8859-1

edit: aha ok, zu schnell gelesen.

jo, lösung bitte bei sowas immer posten, ich hasse es mit google auf solche threads zu stoßen!

Obermotz

Fünfzylindernazi
Avatar
Registered: Nov 2002
Location: OÖ/RI
Posts: 5262
Das Problem war (entgegen meiner Vermutung) Anwendungsspezifisch, darum keine Lösung ;)

jives

And the science gets done
Avatar
Registered: Sep 2001
Location: Baden
Posts: 3548
Darf ich trotzdem nachhaken und nach dem Problem bzw. der Lösung fragen? Ein paar Stichworte würden schon reichen...

Ich glaube nämlich, vor einiger Zeit auf etwas Ähnliches gestoßen zu sein und keine Lösung gefunden zu haben.

mat

Administrator
Legends never die
Avatar
Registered: Aug 2003
Location: nö
Posts: 25708
Aus meiner Erfahrung heraus ist es am besten, wenn Apache-seitig "AddDefaultCharset Off" gesetzt wird und die HTML-Seite per Meta-Tag das Charset selbst bestimmt. Natürlich schließt das nicht aus, dass es noch Probleme mit der DB-Verbindung, der DB-Struktur und der Kodierung der Dateien geben kann.

COLOSSUS

Administrator
GNUltra
Avatar
Registered: Dec 2000
Location: ~
Posts: 12211
Zitat von mat
Aus meiner Erfahrung heraus ist es am besten, wenn Apache-seitig "AddDefaultCharset Off" gesetzt wird und die HTML-Seite per Meta-Tag das Charset selbst bestimmt.

Imho ist das keine keine empfehlenswerte Loesung - diese Information gibt es dann nur in HTML, und sobald man mal andere Textdaten via HTTP transportiert braucht man erst wieder einen korrekten Content-Type mit entsprechendem Charset im Header. Und da gehoert die Information auch hin.

Letztendlich kommt man um eine korrekte Konfiguration des Webservers nicht herum. Sollte dieser keine entsprechende Flexibilitaet oder Konfigurierbarkeit fuer den Content-Type bieten → weg damit.

mat

Administrator
Legends never die
Avatar
Registered: Aug 2003
Location: nö
Posts: 25708
Zitat von COLOSSUS
Imho ist das keine keine empfehlenswerte Loesung - diese Information gibt es dann nur in HTML, und sobald man mal andere Textdaten via HTTP transportiert braucht man erst wieder einen korrekten Content-Type mit entsprechendem Charset im Header. Und da gehoert die Information auch hin.
Deshalb gibts ja AddCharset. AddDefaultCharset dient nur der Bequemlichkeit und wird genau dann ungut, wenn mehrere Charsets innerhalb eines Vhosts verwendet werden (müssen). Meine Antwort oben war also nicht genau genug:

1.) AddDefaultCharset Off
2.) AddCharset für diverse File Extensions (halte ich derzeit bis PHP6 mit voller UTF8-Unterstützung kommt noch in 8859-15, falls möglich)
3.) HTML => Meta-Tag
Kontakt | Unser Forum | Über overclockers.at | Impressum | Datenschutz