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:
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)
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 ?
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:
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" />
@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.
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.
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:
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.
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)
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 "á ä à ã â" ??
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.
(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:
text =replace(text, arrHTMLChars(charCounter), arrHTMLCodes(charCounter))
next
makeChars = text
EndFunction
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.
(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:
public function createAlias($string) {
//remove any '-' from the string they will be used as concatonater
$str = str_replace('-', ' ', $string);
$str = htmlentities(utf8_decode($str));
$str = preg_replace(
array('/ß/','/&(..)lig;/', '/&([aouAOU])uml;/','/&(.)[^;]*;/'),
array('ss',"$1","$1".'e',"$1"),
$str);
// remove any duplicate whitespace, and ensure all characters are alphanumeric
$str = preg_replace(array('/\s+/','/[^A-Za-z0-9\-]/'), array('-',''), $str);
// lowercase and trim
$str = trim(strtolower($str));
return $str;
}
publicfunction createAlias($string){
//remove any '-' from the string they will be used as concatonater