problemen met lettercodering UTF-8

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Pagina: 1 2 volgende »

02/06/2014 21:04:49
Quote Anchor link
Beste mensen,

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)
PHP script in nieuw venster Selecteer het PHP script
1
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" />

De pagina waar ik de gegevens invoer staat in HTML5
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8" />

Mijn editor (bluefish) staat ook op utf-8 ingesteld.

Moet ik nu nog meer instellen?

Alvast bedankt
Gewijzigd op 02/06/2014 21:15:37 door
 
PHP hulp

PHP hulp

12/04/2021 00:05:09
 
Ivo P

Ivo P

03/06/2014 00:38:57
 

03/06/2014 07:55:02
Quote Anchor link
Het enige dat ik kan vinden is, dat ik in een .htaccess bestand de codering op utf-8 zou moeten zetten. Klopt dat?
 
Erwin H

Erwin H

03/06/2014 08:07:19
Quote Anchor link
Ivo gaf die uitstekende link toch al 7 uur voor je vraag. Nog niet gelezen?
 

03/06/2014 08:14:54
Quote Anchor link
Ja, maar het enige dat ik daar uit kan halen is dat van die .htaccess. Wat bij nadere bestudering wel vreemd is, daar dit, volgens andere documentatie, ook al wordt geregeld met de <meta charset="utf-8" />. Ik had de handleiding al voor die tijd gelezen, en volgens mij heb ik alles gedaan wat nodig is. Anders had ik de vraag niet gesteld.

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.
Gewijzigd op 03/06/2014 08:15:29 door
 
Erwin H

Erwin H

03/06/2014 08:31:48
Quote Anchor link
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?
 
Ward van der Put
Moderator

Ward van der Put

03/06/2014 08:33:13
Quote Anchor link
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().
 

03/06/2014 08:39:48
Quote Anchor link
Hoi Ward,

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
 
Ward van der Put
Moderator

Ward van der Put

03/06/2014 08:42:02
Quote Anchor link
Eenmalig per verbinding is inderdaad voldoende.
 

03/06/2014 08:43:00
Quote Anchor link
Gaan we proberen, dank.
 
Ivo P

Ivo P

03/06/2014 11:23:32
Quote Anchor link
Zorg dat je álle punten meeneemt uit dat artikel.

"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.
 

03/06/2014 15:12:13
Quote Anchor link
@ Ward
Inmiddels getest en jouw oplossing werkt nu correct.
 
Ivo P

Ivo P

03/06/2014 15:19:04
Quote Anchor link
Maar heb je nu ook alle punten toegepast?

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.
 

03/06/2014 16:04:51
Quote Anchor link
@ Erwin
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.
Gewijzigd op 03/06/2014 16:14:33 door
 
Dos Moonen

Dos Moonen

03/06/2014 18:16:27
Quote Anchor link
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)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
<?php

// 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
 

03/06/2014 19:54:38
Quote Anchor link
Wat is dan het verschil tussen de header en de meta tag en de .htaccess aanwijzing. Of eigenlijk wat doet nu wat. Want header heb ik inderdaad niet ingesteld.

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 ...
Gewijzigd op 03/06/2014 20:19:32 door
 
Ivo P

Ivo P

03/06/2014 20:50:48
Quote Anchor link
We kunnen een samenvatting maken van het artikel, maar je mag het ook zelf gewoon nog een keer lezen en het lijstje zelf maken.

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.
 
Dos Moonen

Dos Moonen

03/06/2014 20:54:58
Quote Anchor link
De meta tag staat in de html, als je de html opslaat en opent is er geen server die een Content-Type header mee kan sturen. Wel kan de meta tag geparsed worden.

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


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
 

03/06/2014 21:20:46
Quote Anchor link
Ik heb nog even in de instellingen van phpmyadmin gekeken. Daar kom ik het volgende tegen:
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?
Gewijzigd op 03/06/2014 21:21:27 door
 
Erwin H

Erwin H

03/06/2014 21:22:25
Quote Anchor link
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?

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)
 
Dos Moonen

Dos Moonen

03/06/2014 21:33:25
Quote Anchor link
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
 

Pagina: 1 2 volgende »



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.