login  Naam:   Wachtwoord: 
Registreer je!
 Forum

UTF-8 in database, niet alle tekens werken

Offline bertenz - 18/05/2008 20:53 (laatste wijziging 18/05/2008 20:54)
Avatar van bertenzHTML beginner Hallo allemaal,

Voor mijn website worden allerlei teksten opgeslagen in een database met collatie: utf8_general_ci. Ook de kolommen in de tabel hebben collatie utf8_general_ci.
Mijn teksten sla ik op met mysql_real_escape_string() en ik hou rekening met magic_quotes:
  1. {
  2. $report_match = stripslashes($report_match);
  3. $report_match = mysql_real_escape_string($report_match);
  4. }
  5. else
  6. {
  7. $report_match = mysql_real_escape_string($report_match);
  8. }

Als ik de data weer wil ophalen en weergeven, gebruik ik htmlentities:
  1. $report_text = htmlentities($result_report['report_text'],ENT_QUOTES,"UTF-8");

Echter als ik een à in de tekst heb zitten, dan wordt deze niet goed weergegeven op mijn website. Overigens worden de tekens zo opgeslagen:
ä á à â ã
(ä á à â ã)

Wie kan mij vertellen hoe het komt dat niet alle tekens goed weergegeven worden ? En klopt het wel dat de tekst op de bovenstaande manier in de database zichtbaar is (dus weergegeven met die vreemde tekens) ? Ik heb al een paar keer hier en op google gezocht, maar ik kan het antwoord hierop niet gevonden krijgen. (denk ik)

20 antwoorden

Gesponsorde links
Offline Joost - 18/05/2008 22:11
Avatar van Joost PHP expert Probeer het eens met htmlspecialchars().
Offline bertenz - 18/05/2008 23:15
Avatar van bertenz HTML beginner Heb het net geprobeerd, maar er veranderd niks. De à kan niet weergegeven worden. Ook als ik de regel niet bewerk met htmlentities() of htmlspecialchars() krijg ik hetzelfde resultaat. Het is toch eigenlijk de bedoeling dat je data die je op wilt slaan zo min mogelijk bewerkt of niet ? Zouden de originele tekens dan niet in de database moeten staan ipv "ä á à â ã" of moeten die speciale tekens altijd omgezet worden ?
Offline Stijn - 18/05/2008 23:37
Avatar van Stijn PHP expert
  1. header("Content-Type:text/html;charset=ISO-8859-1");

Zet dit eens bovenaan je php pagina.
Offline bertenz - 19/05/2008 20:06 (laatste wijziging 30/05/2008 16:30)
Avatar van bertenz HTML beginner Bedankt voor je hulp, maar als ik die header gebruik, krijg ik de tekens zoals ze ook in de database opgeslagen worden (dus: ä á à â ã). Overigens had ik eerst de header voor UTF-8 in mijn pagina staan:
  1. header("Content-Type: text/html; charset=UTF-8");

Het lijkt me dat ik de charsets toch wel goed heb gezet ... Of moet ik nog iets in de database goed zetten. Tot nu toe heb ik het volgende:
- Database standaard ingesteld op "utf8_general_ci"
- Kolommen zijn ingesteld op "utf8_general_ci"
- Ik maak gebruik van htmlentities($var,ENT_QUOTES,"UTF-8)
- header("Content-Type: text/html; charset=UTF-8");
- <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

Iemand die mij kan helpen ?

Edit: Niemand die mij hierbij kan helpen ??
Offline marten - 30/05/2008 16:54
Avatar van marten Beheerder Ik mis alleen nog dat je je scripts moet opslaan met UTF-8 als encoding. Ik ben op dit moment ook bezig daarmee.
Offline bertenz - 30/05/2008 17:34
Avatar van bertenz HTML beginner Allebei bedankt voor jullie reacties.

@Sandernerd: Hoe geef ik die invoermethode eigenlijk aan ? Ik heb in mijn pagina's staan dat de pagina UTF-8 gebruikt, maar hoe moet ik dan de invoermethode aangeven ? De data wordt onbewerkt opgeslagen, dus wat zou ik hiermee moeten doen? (behalve dan dat het eerst door mysql_real_escape_string() wordt gehaald).

@marten: Wat bedoel je eigenlijk precies met het script opslaan als UTF-8 ? Moet dan in elk script iets worden toegevoegd ? Laat aub weten als je ermee klaar bent, want ik snap eerlijk gezegd niet wat je precies bedoeld.
Offline ArComAr - 30/05/2008 20:39 (laatste wijziging 30/05/2008 20:40)
Avatar van ArComAr VB.NET gevorderde als uw collatie op UTF8 staat, dan kunnen tekens als "ä á à â ã" niet worden opgeslagen. Dit omdat UTF8 maar de ASCII tekens tot 127 kan opslaan. Die speciale tekens hun ASCII waarde begint pas vanaf waarde 128.

http://www.asciitable.com
Offline Grayen - 30/05/2008 23:08
Avatar van Grayen PHP ver gevorderde Misschien heb je hier wat aan. Het kan namelijk zo zijn dat ook al heb je alles in je database ingesteld op UTF-8 dat door PHP config instellingen alsnog latin1 wordt gebruikt. In het volgende topic wordt uitgelegd hoe dit verholpen kan worden:

http://modxcms....5#msg70925
Offline bertenz - 02/06/2008 15:39
Avatar van bertenz HTML beginner Allereerst allebei hartstikke bedankt voor jullie reacties.

@Arcomar: Ik weet eerlijk gezegd niet precies wat je nou eigenlijk bedoelde. De tekenreeks "ä á à â ã" krijg ik in phpmyadmin te zien voor de tekst "ä á à â ã". Hoort dat zo ?

@Grayen: Als ik aan het eind van de week wat meer tijd heb ga ik zeker kijken naar dat artikel.

Nogmaals bedankt allebei.
Offline marten - 02/06/2008 15:43
Avatar van marten Beheerder Welke editor gebruik je?
Offline bertenz - 02/06/2008 16:08 (laatste wijziging 02/06/2008 16:08)
Avatar van bertenz HTML beginner Bedoel je de editor voor de php-pagina's ? Dat is Dreamweaver CS3 ...
Offline marten - 02/06/2008 16:18
Avatar van marten Beheerder Wat staat er als je ctrl - J kiest en dan links bij titel / codering. Daar moet je het ook nog als UTF-8 opslaan.
Offline bertenz - 02/06/2008 16:27
Avatar van bertenz HTML beginner De codering stond daar op "Western European". Als ik daar Unicode (UTF-8) selecteer, kan ik nog een "Unicode Normalization Form" selecteren. Weet iemand toevallig wat ik daar het beste kan kiezen ? De opties zijn:
- None
- C (Canonical Decomposition, followed bij Canonical Composition)
- D (Canonical Decomposition)
- KC (Compatibility Decomposition, Followed bij Canonical Composition)
- KD (Compatibility Decomposition)
Offline marten - 02/06/2008 16:41
Avatar van marten Beheerder Ik heb hem op C staan
Offline bertenz - 02/06/2008 17:05
Avatar van bertenz HTML beginner Alle tekens voor zover ik ze ken en tegenkom, worden nu goed weergegeven, dus het lijkt erop dat het zo goed wordt opgeslagen ... Allemaal hartstikke bedankt voor jullie hulp.

Maar Marten, worden de tekens "á ä à ã â" ook opgeslagen als "á ä à ã â" ??
Offline Nehbur - 02/11/2009 21:35
Avatar van Nehbur Nieuw lid Ik heb uren en uren vastgezeten hierop. Ik werd er helemaal gestoord van. Ik gebruik input type=text velden en FCKeditor textarea's in mijn forms en een MSSQL 2008 database. Alles wat vanuit die textarea kwam werd goed met HTML entities in de database gezet, maar dezelfde tekst vanuit een input veld werd er zoals ä á à â ã ingezet. Om gek van te worden.

Wat voor mij werkte was door in het form tag

"accept-charset="ISO-8859-1""

te plaatsen. Nu kwam de tekst er "wysiwyg" in geplaatst. Wellicht niet met html entities, maar in elk geval als normale special characters.

Hoop dat 't helpt
Offline lau - 02/11/2009 23:09
Avatar van lau HTML interesse Je moet de verbinding ook naar UTF-8 zetten:
  1. $connection = mysql_connect($hostname, $username, $password);
  2. mysql_query("SET NAMES 'utf8'", $connection);
Offline Richard - 03/11/2009 10:00
Avatar van Richard Crew algemeen http://wiki.php..._gebruiken
Offline Nehbur - 03/11/2009 13:34 (laatste wijziging 03/11/2009 13:35)
Avatar van Nehbur Nieuw lid (mijn voorgaande bericht was een plaatselijke oplossing, maar het werkte niet optimaal, ik ben nog verder gaan researchen)

Ik heb hier ook m'n kop op stukgeslagen op een verharde stoeprand. Wat je het beste kunt doen is HTML entity names in je database zetten. Ik heb daar in ASP een functie voor gevonden van een slimmerd:

  1. Function makeChars(text)
  2. 'Place all the different characters in this string, separated by a |
  3. strCharacters = "&|<|>|¡|¢|£|¥|¦|§|¨|©|ª|«|¬|®|™|¯|°|±|²|³|´|µ|¶|·|¸|¹|º|»|¼|½|¾|¿|×|÷|À|Á|Â|Ã|Ä|Å|Æ|Ç|È|É|Ê|Ë|Ì|Í|Î|Ï|Ð|Ñ|Ò|Ó|Ô|Õ|Ö|Ø|Ù|Ú|Û|Ü|Ý|Þ|ß|à|á|â|ã|ä|å|æ|ç|è|é|ê|ë|ì|í|î|ï|ð|ñ|ò|ó|ô|õ|ö|ø|ù|ú|û|ü|ý|þ|ÿ|Œ|œ|Š|š|Ÿ|ˆ|˜|–|—|‘|’|‚|†|‡|…|‰|‹|›|€"
  4. 'Place the HTML-codes for the characters in this string, separated by a |
  5. strHTMLCodes = "&amp;|&lt;|&gt;|&iexcl;|&cent;|&pound;|&yen;|&brvbar;|&sect;|&uml;|&copy;|&ordf;|&laquo;|&not;|&reg;|&trade;|&macr;|&deg;|&plusmn;|²|³|&acute;|&micro;|&para;|&middot;|&cedil;|¹|&ordm;|&raquo;|¼|½|¾|&iquest;|&times;|&divide;|&Agrave;|&Aacute;|&Acirc;|&Atilde;|&Auml;|&Aring;|&AElig;|&Ccedil;|&Egrave;|&Eacute;|&Ecirc;|&Euml;|&Igrave;|&Iacute;|&Icirc;|&Iuml;|&ETH;|&Ntilde;|&Ograve;|&Oacute;|&Ocirc;|&Otilde;|&Ouml;|&Oslash;|&Ugrave;|&Uacute;|&Ucirc;|&Uuml;|&Yacute;|&THORN;|&szlig;|&agrave;|&aacute;|&acirc;|&atilde;|&auml;|&aring;|&aelig;|&ccedil;|&egrave;|&eacute;|&ecirc;|&euml;|&igrave;|&iacute;|&icirc;|&iuml;|&eth;|&ntilde;|&ograve;|&oacute;|&ocirc;|&otilde;|&ouml;|&oslash;|&ugrave;|&uacute;|&ucirc;|&uuml;|&yacute;|&thorn;|&yuml;|&OElig;|&oelig;|&Scaron;|&scaron;|&Yuml;|&circ;|&tilde;|&ndash;|&mdash;|&lsquo;|&rsquo;|&sbquo;|&dagger;|&Dagger;|&hellip;|&permil;|&lsaquo;|&rsaquo;|&euro;"
  6. 'Create Arrays with the characters
  7. arrHTMLChars = Split(strCharacters, "|")
  8. arrHTMLCodes = Split(strHTMLCodes, "|")
  9. charCounter = 0
  10. for charCounter = 0 to ubound(arrHTMLChars)
  11. text = replace(text, arrHTMLChars(charCounter), arrHTMLCodes(charCounter))
  12. next
  13. makeChars = text
  14. End Function


Dit zorgt ervoor dat je al je special chars in HTML entity names (niet codes) in je database zet. Nu hoeft je alleen nog maar UTF-8 in je website als charset te gebruiken en klaar is kees.
Offline marten - 03/11/2009 13:49
Avatar van marten Beheerder
Nehbur schreef:
(mijn voorgaande bericht was een plaatselijke oplossing, maar het werkte niet optimaal, ik ben nog verder gaan researchen)

Ik heb hier ook m'n kop op stukgeslagen op een verharde stoeprand. Wat je het beste kunt doen is HTML entity names in je database zetten. Ik heb daar in ASP een functie voor gevonden van een slimmerd:

[..code..]

Dit zorgt ervoor dat je al je special chars in HTML entity names (niet codes) in je database zet. Nu hoeft je alleen nog maar UTF-8 in je website als charset te gebruiken en klaar is kees.


Wat ik zelf altijd gebruik zijn aliassen. Ik sla alle titels gewoon op maar werk altijd met de alias (htaccess, db opvragen ed). Ik gebruik hiervoor de volgende functie die ik uit Joomla heb geplukt:

  1. public function createAlias($string) {
  2. //remove any '-' from the string they will be used as concatonater
  3. $str = str_replace('-', ' ', $string);
  4.  
  5. $str = htmlentities(utf8_decode($str));
  6. $str = preg_replace(
  7. array('/&szlig;/','/&(..)lig;/', '/&([aouAOU])uml;/','/&(.)[^;]*;/'),
  8. array('ss',"$1","$1".'e',"$1"),
  9. $str);
  10. // remove any duplicate whitespace, and ensure all characters are alphanumeric
  11. $str = preg_replace(array('/\s+/','/[^A-Za-z0-9\-]/'), array('-',''), $str);
  12.  
  13. // lowercase and trim
  14. $str = trim(strtolower($str));
  15. return $str;
  16. }
Gesponsorde links
Dit onderwerp is gesloten.
Actieve forumberichten
© 2002-2024 Sitemasters.be - Regels - Laadtijd: 0.248s