Hey,

Als ik in een PHP pagina "plain" de tekst "wéér" neer zet, gaat dit goed.
Als ik dit uit een database laad, krijg ik "wéér".

Ik gebruik de regel
mysql_query("SET NAMES 'utf8' COLLATE 'utf8_unicode_ci'");?

Als ik die weg haal werkt het wel goed, maar het bestand dat het systeem dan naar een website upload geeft dan weer vraagtekens i.p.v. "é".
Als ik die regel wel gebruik is het bestand dat naar die website geupload wordt wel goed, maar is de pagina op mijn server weer met "é".

Ik hoop dat iemand begrijpt wat ik bedoel.

Alvast bedankt,
Je gebruikt hopelijk wel iets als [php]htmlentities[/php] om de letters te escapen? Heb je die wel in de juiste charset?
Indien je er voor kiest om met utf8 te werken, moet je alles in utf8 zetten.

* Voeg toe in PHP:
<?php
header("Content-Type: text/html; charset=UTF-8");
?>
Dit doe je vooraleer je html naar de gebruiker stuurt.
In principe dus net voor
<!DOCTYPE ... >
<html

* Voeg toe in HTML, ergens in <head>:
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">


* maak je MySQL database en tabellen aan met Collation: utf8_unicode_ci


Ik denk dat dit het meest belangrijke is. Er zijn nog extra maatregelen die je kunt nemen (in je formulier, in je mySQL queries, ...).
Probeer eens uit




Behalve de header regel had ik alles al toegepast. Helaas heeft de header regel geen zin.

Edit: Ja, ik gebruik inderdaad htmlentities()
Probeer dit eens uit.

<?php
// @see http://www.phphulp.nl/php/forum/topic/utf8-probleem/82712/
/*
CREATE DATABASE phphulp DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;

CREATE TABLE IF NOT EXISTS gastenboek (
id int(11) NOT NULL AUTO_INCREMENT,
message text COLLATE utf8_unicode_ci NOT NULL,
PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
*/
// maar dan uiteraard met je eigen gegevens
$con = mysql_connect('localhost', 'root', '');
mysql_select_db('phphulp', $con);

if ($_SERVER['REQUEST_METHOD'] == 'POST') {
if (isset($_POST['message'])) {
mysql_query(
"INSERT INTO gastenboek (message) VALUES ('" . mysql_real_escape_string($_POST['message']) . "');" // bij het inserten enkel escapen
);
}
header('location: ?');
}
$res = mysql_query("SELECT message FROM gastenboek");
$items = '';
while($row = mysql_fetch_assoc($res)) {
$items .= '<p>' . htmlentities($row['message'], ENT_QUOTES, "UTF-8") . '</p>'; // htmlentities enkel bij SELECT
}
header("Content-Type: text/html; charset=UTF-8");
echo '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">;
<html xmlns="http://www.w3.org/1999/xhtml"; xml:lang="en" lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
<title>UTF-8 voorbeeld</title>
</head>
<body>
<form action="" method="post">
<div><textarea name="message"></textarea></div>
<div><input type="submit" value="GO!"/></div>
</form>
<div id="messages">' . $items . '</div>
</body>
</html>';
?>

Vergeet even dat dit niet deugt als gastenboek; ik heb enkel het hoogstnoodzakelijke gepost.

Bij mij gebeurt er wat ik verwacht.
Ik heb stukken uit je code geprobeerd, zonder succes. Nog steeds geen euro teken.

Infobord:

Admin paneel:
Is dit geen Javascript?
Ik heb mijn code volledig ongewijzigd gecopy/paste (ja, ik heb op zowat elke pc lokaal een database phphulp).
Ik heb het gisteren zelf uitgetest; het euro-teken wordt juist weergegeven bij mij.

Test eens mijn volledige code.
(database die je speciaal gebruikt om te testen, test-mapje, ... los van waar je nu mee bezig bent)

Misschien passeer je je data twee keer door htmlentities of zo.
Nee, dit is geen javascript.

Het zou kunnen dat ik per ongeluk twee keer htmlentities heb, maar zou je dan op z'n minst niet iets moeten zien in plaats van lege plekken?

Reageren