problemen met lettercodering UTF-8
Wie heeft een goede uitleg over wat ik allemaal moet instellen om teksten die ik uit een input formulier naar een db tabel schrijf en er daarna weer uit haal om op een website te publiceren goed weer te geven.
In concreto:
Mijn tabellen zijn allemaal in utf-8_general_ci. De website staat ook in utf-8:
Code (php)
1
2
3
4
5
2
3
4
5
<!DOCTYPE html>
<html lang="nl">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta charset="utf-8" />
<html lang="nl">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta charset="utf-8" />
De pagina waar ik de gegevens invoer staat in HTML5
Mijn editor (bluefish) staat ook op utf-8 ingesteld.
Moet ik nu nog meer instellen?
Alvast bedankt
http://wiki.pfz.nl/charactersets
Toevoeging op 03/06/2014 00:38:57:
http://wiki.pfz.nl/charactersets
Toevoeging op 03/06/2014 00:38:57:
http://wiki.pfz.nl/charactersets
Het enige dat ik kan vinden is, dat ik in een .htaccess bestand de codering op utf-8 zou moeten zetten. Klopt dat?
Ivo gaf die uitstekende link toch al 7 uur voor je vraag. Nog niet gelezen?
Overigens gaat het al fout bij het naar de database sturen van het speciale character, bv -ë-. Het teken staat op een vreemde wijze al in de database.
Ten eerste weet je helemaal niet hoe de gegevens in de database staan, dus dat het op een 'vreemde wijze' erin staat kan je niet zeggen. Ten tweede staan er nog veel meer tips in dat artikel. Kijk bijvoorbeeld eens naar de database connectie. Staat die al goed?
J Pla op 03/06/2014 08:14:54:
Overigens gaat het al fout bij het naar de database sturen van het speciale character, bv -ë-. Het teken staat op een vreemde wijze al in de database.
Als je iets fout opslaat in de database, komt het er aansluitend precies even fout uit. Stel daarom de karakterset voor de databaseverbinding in op UTF-8, bijvoorbeeld met mysqli_set_charset().
Kan ik dat mysqli_set_charset() eenmaling direct na de maken van de verbinding instellen? Of moet ik het elke keer voordat ik gegevens naar de database stuur doen?
Jop
Eenmalig per verbinding is inderdaad voldoende.
Gaan we proberen, dank.
"alle" als in "niet 1 of 2 overslaan, omdat die niet zo van belang lijken"
Daarnaast: als je nu al data in je database hebt die mogelijk niet op de verwachte manier is opgeslagen, test dan met data die na je aanpassingen opnieuw zijn opgeslagen.
En zoals in het artikel genoemd: dat je met een of andere tool de data niet goed kunt lezen, wil niet zeggen dat de data er fout in staat. Kan ook zijn dat je tooltje (phpmyadmin?) het weergeeft op een andere manier dan de bedoeling is.
De META tag voor de karakterset wordt doorgaans alleen bekeken als er in de headers (.htaccess, of met de header() functie van php) geen karakterset is gegeven.
Dus als de header zegt ANSI en META zegt Unicode, dan is het ANSI.
Inmiddels getest en jouw oplossing werkt nu correct.
Ik denk met name nog aan de http-header.
Dat je nu test en ziet wat je wilt zien, wil mi. nog niet zeggen dat het dan ook 100% waterdicht is.
Wat zou ik dan niet gedaan hebben volgens jou? Die headers heb ik toch in mijn eerste reactie aangegeven?
Sommige dingen snap ik ook niet en er staat niet waar het ingesteld kan worden. Zoals bv my.ini en wat is PostgrSQL oid?
Zoals eerder aangegeven denk ik dat ik alles heb gedaan, maar uit de beschrijving wordt mij niet duidelijk wat ik waar moet doen en waarom. De .htaccess aanpassen en de <META> op utf-8 zetten lijkt mij uit andere sites dubbel op.
Quote:
Wat zou ik dan niet gedaan hebben volgens jou? Die headers heb ik toch in mijn eerste reactie aangegeven?
Nee, je geeft aan de meta tag goed ingesteld te hebben. Je hebt niets gezegt over de HTTP Content-Type header.
Code (php)
1
2
3
4
5
6
2
3
4
5
6
<?php
// we weten dus niet of je dit doet of niet:
header('Content-Type: text/html; charset=UTF-8');
?>
// we weten dus niet of je dit doet of niet:
header('Content-Type: text/html; charset=UTF-8');
?>
Maar het kan inderdaad ook via .htaccess al zou ik toch zelf graag horen dat je gecontroleerd hebt (via firebug's bijvoorbeeld) of het ook echt met de juiste Content-Type (HTTP) header bij je browser aan komt.
PS. PostgreSQL is een concurent van MySQL, net als Microsoft's SQL Server, Oracle RDBMS en velen anderen.
Gewijzigd op 03/06/2014 18:22:36 door Dos Moonen
Ofwel, wat moet ik precies doen om alles standaard met utf-8 te laten werken en niet ook nog eens [htmlentities($row[0],ENT_QUOTES,"UTF-8");] te gebruiken om de gegevens correct uit de database terug te krijgen ...
Zoals ik net boven zei: 'alle'
Dat zei ik niet voorniets. Om een vage reden zie ook jij weer een aanleiding om iets over te slaan (content type header)
En zoals ook al gezegd: meta tag iser alleen voor als de http-header afwezig of onduidelijk was.
https://code.google.com/p/doctype-mirror/wiki/MetaCharsetAttribute:
In order for all browsers to recognize a <meta charset> declaration, it must be
- Within the <head> element,
- Before any elements that contain text, such as the <title> element, AND
- Within the first 512 bytes of your document, including DOCTYPE and whitespace
- Within the <head> element,
- Before any elements that contain text, such as the <title> element, AND
- Within the first 512 bytes of your document, including DOCTYPE and whitespace
Zorg dat de Content-Type de charset op UTF-8 zet in de header, dus niet zoals PHPHulp charsetloos:
https://www.dropbox.com/s/dqwxwrhll7lwxdz/Screenshot%202014-06-03%2020.46.07.png (firebug)
https://www.dropbox.com/s/ylbgj1rg4iqmnbj/Screenshot%202014-06-03%2020.50.59.png (Firefox's ontwikkelaars tools)
https://www.dropbox.com/s/5e0hcq0qydtnyk4/Screenshot%202014-06-03%2020.53.11.png (Chrome's ontwikkelaars tools)
Waarschijnlijk zorgt die .htaccess aanpassen van je er voor dat het goed gaat, maar controleer dus de waarde van de Content-Type header om het zeker te weten!
Gewijzigd op 03/06/2014 20:56:50 door Dos Moonen
Collatie van de serververbinding: utf8mb4_general_ci. Zou dat niet utf8_general_ci moeten zijn? Of maakt dat niet uit?
Verderop staat ook nog: Karakterset van server: UTF-8 Unicode (utf8)
Bij variabelen kom ik dit tegen: character set connection: latin1; character set database: latin1; en nog een paar die niet op utf-8 staan. Maakt dat wat uit? Kennelijk kan ik ze niet veranderen met [SET NAMES 'utf8';] zoals in geadviseerd artikel staat. Ook niet via phpmyadmnin. Maar hoe dan wel?
J Pla op 03/06/2014 16:04:51:
@ Erwin
Wat zou ik dan niet gedaan hebben volgens jou? Die headers heb ik toch in mijn eerste reactie aangegeven?
Wat zou ik dan niet gedaan hebben volgens jou? Die headers heb ik toch in mijn eerste reactie aangegeven?
Het is een beetje mosterds na de maaltijd om nu nog te reageren, maar eerder lukte nu eenmaal niet.
Wat Ivo ook al geheel terecht stelt is dat je alle punten die worden genoemd moet meenemen. Zelfs als het je een keer lukt met maar een deel ervan, zal je geheid dan later nog eens tegen problemen aanlopen. Uit eigen ervaring, FF doet het prima zelfs als je geen header met het content type meegeeft. IE daarintegen, geeft je dan allerlei frutsels waar letters met rare accenten hadden moeten staan.
Uit je eerste post bleek al dat je niet alle punten hebt meegenomen (maar toen wist je die wellicht nog niet), maar in het artikel van Ivo staat alles tot in de puntjes uitgelegd. Als je alles nauwkeurig volgt en implementeert, dan zal het goed gaan. Elke keer weer.
Kort gezegd:
- correcte karakterset voor je database instellen (kan op database, tabel en kolom niveau)
- altijd de connectie met de database correct instellen, elke keer dat je een connectie opzet
- altijd juiste http headers meesturen, ook met downloads en ajax responses
- eventueel meta tags meegeven (secundair tov vorige punt)
Quote:
Zou dat niet utf8_general_ci moeten zijn? Of maakt dat niet uit?
Nee, utf8mb4_general_ci is de correcte max 4 bytes per code point versie die overeen komt met de UTF-8 specificatie van max 4 bytes.
utf8_general_ci laat 6 bytes toe, wat dus ongeldige data toe laat.
Gewijzigd op 03/06/2014 21:33:42 door Dos Moonen