[PHP5 + MySQL] UTF-8 tekst uit database verkeerd weergegeven

Pagina: 1
Acties:
  • 201 views sinds 30-01-2008
  • Reageer

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
na enkele uren zoeken zowel hier als elders...

Ik ben op het moment bezig met een webapplicatie dat een adressenbestand moet verzorgen. Informatie hierin is betrekkelijk eenvoudig: Naam en adres, land (aantal contacten buiten Nederland), telefoongegevens, e-mail en de mogelijkheid om een of meer notities aan het record toe te voegen.

Gisteren heb ik de applicatie van m'n eigen testomgeving verhuisd naar de machine waar de applicatie uiteindelijk moet draaien. Relevante specificaties van beide omgevingen:
(Windows XP is geen server OS, ben ik me van bewust, maar omdat er geen residente webserver beschikbaar is, is gekozen de applicatie op de machine van de gebruiker te draaien.)

Ontwikkelomgeving
  • Windows XP
  • Apache 2.0
  • PHP 4.3.9 (zonder extensions, MySQL connector geintegreerd)
  • MySQL 5.0.18
Serveromgeving
  • Windows XP
  • Apache 2.2
  • PHP 5.2.0 (met MySQL extension, als enige)
  • MySQL 5.0.27
Bij eerste test bleken wat kleine config-instellingen de dader van een hoop foutmeldingen en al dit werkt nu naar behoren, op één grote irritatie na: (bijvoorbeeld) karakters met accenten (é, ë, è etc) komen niet goed in de output terecht. (d.w.z. karakters voorbij positie 127 in US-ASCII).

Bekend probleem op zich, karakterset moet ergens verkeerd ingesteld staan, vermoedde ik.
Echter lijkt dat niet het geval te zijn, alle encoding staat in alle gevallen ingesteld op UTF-8.

Om het probleem te lokaliseren heb ik het een en ander aan m'n ontwikkelomgeving veranderd, deze is nu van dezelfde PHP versie voorzien als de server (5.2.0) en nu heb ik hetzelfde probleem in beide omgevingen, het lijkt het dus sterk op dat PHP in dit geval de boosdoener is.

Om een en ander netjes te kunnen testen heb ik:
1) Een export (SQL, UTF-8) gemaakt van m'n database en deze opnieuw aangemaakt (utf8_general_ci).
2) De export gecontroleerd op encoding (utf-8 is de enige encoding waarin de inhoud klopt, accenten en al)
3) Vervolgens de database-export opnieuw geimporteerd (en utf-8 aangegeven als karakterset bij import).

Dit zou moeten betekenen dat de inhoud van de database nu zeker weten utf-8 is en geen bastaard (latere controle mbv mb_detect_encoding() (op een string met een karakter dat -wel- verkeerd wordt weergegeven) verifiëert dit)

4) http-headers, html-output en browser-instellingen gecontroleerd - alledrie utf-8

Tijdens dit instellen blijkt dat het in de browser (Firefox 2.0, maar ook IE6) dat het instellen van zowel US-ASCII als ISO-8859-1 als karakterset tot juiste rendering leidt van de karakters. Echter, de output van de pagina is overal utf-8, en wordt ook alszodanig gedetecteerd (dus een override is verre van wenselijk omdat het de rendering van andere websites in de weg gaat zitten).

Uit de search kwam aan de hand van een soortgelijk probleem de suggestie om de output in utf8_encode() te hullen, maar dat was juist omdat php4 en de toenmalige MySQL versie -geen- (unicode) utf-8 support gaven. (terwijl mijn probleem voortkomt uit een upgrade van PHP4 naar PHP5.)

Bovendien is utf8_encode() er om een string te vertalen naar utf-8, terwijl mb_detect_encoding() aangeeft dat het reeds een string in utf-8 is.

de output door de utf8_encode() functie voeren is een optie, maar als de input van die functie al utf-8 gecodeerd is wordt die door deze functie juist gronding om zeep geholpen, iets dat ik liever vermijd.

Hopelijk is het geheel overzichtelijk (genoeg) en is het probleem duidelijk. Wie heeft een antwoord / suggestie, of kan me van het dwaalspoor helpen waar ik me (mogelijk) op begeef?

Acties:
  • 0 Henk 'm!

  • JeRa
  • Registratie: Juni 2003
  • Laatst online: 30-04 10:28

JeRa

Authentic

Vaak moet je ook de client-verbinding met de database naar de juiste character set zetten. Heb je dit ook gedaan?

Dus direct na het verbinden:
SET NAMES UTF8;
SET CHARACTER SET UTF8;

:)

ifconfig eth0 down


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
JeRa schreef op dinsdag 09 januari 2007 @ 06:46:
Vaak moet je ook de client-verbinding met de database naar de juiste character set zetten. Heb je dit ook gedaan?

Dus direct na het verbinden:
SET NAMES UTF8;
SET CHARACTER SET UTF8;

:)
Argh... zo klein was het dus.

Werkt! _/-\o_

PHP:
1
2
mysql_query ("SET NAMES UTF8");
mysql_query ("SET CHARACTER SET UTF8");

Eraan geplakt en voila, perfect :>

edit:

Dan blijft het toch raar dat dit probleem zich pas voordeed na een upgrade naar php5.
Dat php zelf van de string zegt dat het utf-8 is en het het stiekem toch niet is is raar, maar daar kan ik me nog iets bij voorstellen als MySQL zegt dat het geinterpreteerd moet worden als utf-8, maar het transmissiekanaal zelf ISO-8859-1 codering gebruikt. Al had ik verwacht dat er aan de hand van de informatie -zelf- wordt beoordeeld in welke codering deze beschreven is dan dat daar het woord van de database voor waarheid wordt aangenomen.

[ Voor 69% gewijzigd door Verwijderd op 09-01-2007 11:18 ]