Beste PRGers,
Ik weet dat ik me in het hol van de leeuw ga begeven, met betrekking tot encoding, maar ik heb naar eer en geweten overal utf8 / utf8_unicode_ci gebruikt waar mogelijk.
Lang verhaal kort:
Ik heb een website (CodeIgniter2 met daarin Doctrine2 als ORM) en een Java-tooltje, welke beide gebruik maken van dezelfde table in een MySQL-database.
Zowel het Java-tooltje als de PHP-website schrijven in een tabel voor logging.
De database en tabel zien er zo uit:
Ik wilde als test zowel uit de Java-tool als vanaf de PHP-website een hele zwik non-ascii karakters naar de database sturen:

Verplicht plaatje, omdat GoT loopt te kloten met het Cyrillisch schrift.
Dit ziet er in de database zo uit:

De bovenste regel is de PHP-regel en de onderste regel is de Java-regel.
Wanneer ik de beide regels weer teruglees in mijn PHP-website, wordt de eerste (PHP)regel goed geschreven op het scherm, maar de tweede (Java)regel niet.
In de Java-tool verbind ik op onderstaande manier met de database:
en voor de PHP-website ziet mijn CodeIgniter / Doctrine configuratie er zo uit:
In de header van mijn website staat de volgende encoding:
De doctype is html.
Het probleem lijkt niet in de browser te zitten, immers geven zowel Chrome, Firefox en IE (de eerste twee zowel op Windows als Ubuntu) het op dezelfde manier weer.
Wanneer ik met de PHP-debugger de twee log-regels bekijk, zie ik inderdaad dat er in het PHP-regel de string wel netjes in het geheugen staat en in het Java-regel staan er het volgende

De eerste 128 karakters zijn die ruitjes met vraagtekens, de vraagtekens representeren het Cyrillisch schrift. De leestekens tussen de Cyrillische karakters, worden wel goed weergegeven.
Zoals de regels in het geheugen staan, worden ze ook in de browser weergegeven. Het probleem lijkt dus niet in de vertaalslag tussen PHP en de browser te zitten.
Wie-o-wie kan me helpen dit encoding-probleem te tackelen?
Thnx
Matis
Edit; Misschien ook nog wel een leuk detail: Wanneer ik een var_dump doe van beide regels, dan krijg ik in het geval van de foute Java-regel een lengte van 470 karakters terug en in het geval van de goede PHP-regel een lengte van 800 karakters.
De lengte van de originele string bedraagt 470 karakters.
Edit 2; Ik heb zojuist een testje gedraaid waarin binnen de Java-tool de twee strings terug worden gelezen (al zal dit in het echt nooit gebeuren, want de website is de logging frontend), maar daarin wordt door Java de string zo weergegeven als dat ie in de database zit. In het geval van de Java-string is dat exact als wat ik er in zat, in het geval van de PHP-string, is dat zoals het database-screenshot het laat zien.
Ik weet dat ik me in het hol van de leeuw ga begeven, met betrekking tot encoding, maar ik heb naar eer en geweten overal utf8 / utf8_unicode_ci gebruikt waar mogelijk.
Lang verhaal kort:
Ik heb een website (CodeIgniter2 met daarin Doctrine2 als ORM) en een Java-tooltje, welke beide gebruik maken van dezelfde table in een MySQL-database.
Zowel het Java-tooltje als de PHP-website schrijven in een tabel voor logging.
De database en tabel zien er zo uit:
MySQL:
1
2
3
4
5
6
7
8
9
10
11
| CREATE DATABASE `ci_checklists` /*!40100 DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci */$$ CREATE TABLE `release_checks` ( `id` int(11) NOT NULL AUTO_INCREMENT, `release_id` int(11) NOT NULL, `state_id` int(11) NOT NULL, `check_id` int(11) NOT NULL, `created` datetime NOT NULL, `modified` datetime NOT NULL, `description` longtext COLLATE utf8_unicode_ci, PRIMARY KEY (`id`), ) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci$$ |
Ik wilde als test zowel uit de Java-tool als vanaf de PHP-website een hele zwik non-ascii karakters naar de database sturen:
Verplicht plaatje, omdat GoT loopt te kloten met het Cyrillisch schrift.
Dit ziet er in de database zo uit:
De bovenste regel is de PHP-regel en de onderste regel is de Java-regel.
Wanneer ik de beide regels weer teruglees in mijn PHP-website, wordt de eerste (PHP)regel goed geschreven op het scherm, maar de tweede (Java)regel niet.
In de Java-tool verbind ik op onderstaande manier met de database:
Java:
1
| String dbUrl = "jdbc:mysql://" + _server + ":" + _port + "/" + _schema + "?characterEncoding=UTF-8"; |
en voor de PHP-website ziet mijn CodeIgniter / Doctrine configuratie er zo uit:
PHP:
1
2
| $db['default']['char_set'] = 'utf8'; $db['default']['dbcollat'] = 'utf8_unicode_ci'; |
In de header van mijn website staat de volgende encoding:
HTML:
1
| <meta content="text/html; charset=utf-8" http-equiv="content-type"> |
De doctype is html.
Het probleem lijkt niet in de browser te zitten, immers geven zowel Chrome, Firefox en IE (de eerste twee zowel op Windows als Ubuntu) het op dezelfde manier weer.
Wanneer ik met de PHP-debugger de twee log-regels bekijk, zie ik inderdaad dat er in het PHP-regel de string wel netjes in het geheugen staat en in het Java-regel staan er het volgende
De eerste 128 karakters zijn die ruitjes met vraagtekens, de vraagtekens representeren het Cyrillisch schrift. De leestekens tussen de Cyrillische karakters, worden wel goed weergegeven.
Zoals de regels in het geheugen staan, worden ze ook in de browser weergegeven. Het probleem lijkt dus niet in de vertaalslag tussen PHP en de browser te zitten.
Wie-o-wie kan me helpen dit encoding-probleem te tackelen?
Thnx
Matis
Edit; Misschien ook nog wel een leuk detail: Wanneer ik een var_dump doe van beide regels, dan krijg ik in het geval van de foute Java-regel een lengte van 470 karakters terug en in het geval van de goede PHP-regel een lengte van 800 karakters.
De lengte van de originele string bedraagt 470 karakters.
Edit 2; Ik heb zojuist een testje gedraaid waarin binnen de Java-tool de twee strings terug worden gelezen (al zal dit in het echt nooit gebeuren, want de website is de logging frontend), maar daarin wordt door Java de string zo weergegeven als dat ie in de database zit. In het geval van de Java-string is dat exact als wat ik er in zat, in het geval van de PHP-string, is dat zoals het database-screenshot het laat zien.
[ Voor 12% gewijzigd door Matis op 14-11-2012 14:59 ]
If money talks then I'm a mime
If time is money then I'm out of time