logo logo   UTF-8 - 'Blåbærgrød'




Det er et held, at det danske alfabet indeholder bogstaverne æ, ø og å. Ellers kunne vi hverken skrive eller sige Blåbærgrød.


Anderledes forholder det sig, når det kommer til opsætningen af PHP og MySQL, så de også kan håndtere de 3 små klenodier uden at bruge/vise dem som krummelurer.


Udgangspunktet for det efterfølgende vil være at UTF-8 bruges som karaktersæt. Navnet kan skrives med enten 'lower'- eller 'upper'-case. UPPER anbefales.


Udfordringerne med opsætningen synes derefter at kunne opdeles i mindst 3 niveauer:

  1. at æøå ved 'echo' vises som krummelurer, og at SELECT og ORDER BY ikke kan håndtere dem.
  2. at æøå ved 'echo' vises som æøå, men at SELECT og ORDER BY ikke kan håndtere dem'.
  3. at æøå ved 'echo' vises som æøå og at de kan håndteres af SELECT og ORDER BY'.

Det er selvfølgelig kun den 3die, der er tilfredsstillende.


For at nå dertil er der en række punkter, hvor karaktersæt kan påvirkes:




Webhotel


Skal man afvikle sine data på et webhotel / anden ekstern leverandør, skal man som minimum sikre sig at UTF-8 anvendes for PHP / MySQL. Ellers bør man overveje at holde sig væk.




Webserver


I Apache kan der i httpd.conf åbnes for eller tilføjes:
AddDefaultCharset UTF-8.




.htaccess


I .htaccess kan indsættes (evt. som alternativ til i webserveren, men bør undgås)
IndexOptions +Charset=UTF-8




MySQL


I MySQL tabeller kan æøå ligge som:

æ ø åDataene ligger rigtigt. De kan både vises med 'echo' og der kan foretages SELECT / ORDER BY på dem
æ ø åDataene ligger forkert. De kan vises korrekt med 'echo', men der kan ikke foretages SELECT / ORDER BY på dem.

Der kan godt være 'forkerte' tegn i databasen selvom den er sat rigtigt op. MySQL synes meget åben for at modtage alt hvad den bliver præsenteret for - men det er ikke sikkert, at den kan bruge det.



I databasen anvendes (via phpMyAdmin) følgeende opsætninger:

Opret ny databaseTegnsæt(sortering)utf8_danish_ci
Opret ny tabelTegnsæt(sortering)utf8_danish_ci
Opret nyt felt i tabelTegnsæt(sortering)utf8_danish_ci




DBconnect


Filen, der etablerer forbindelse til DB-serveren, skal indeholde de to funktioner $mysqli_query() og mysqli_set_charset():


<?php
$host = "localhost";
$user = "root";
$password = ""; // På Mac skal password typisk være "root" også $database = "xxxxxxxxx";

// Opret forbindelse til databasen
$db_link = mysqli_connect ($host, $user, $password, $database) or die (mysqli_error());

// Sørger for, at du kan udskrive ÆØÅ korrekt
mysqli_query ($db_link, "SET NAMES utf8");

// Sætter default kar.sæt der anvendes ved overførsel af data DB-serveren
mysqli_set_charset($db_link, "utf8");
?>




$_POST


I forbindelse med indlæsning fra $_POST anvendes 'ENT_QUOTES' til at ændre en række tegn til '&...;'. Derved opnås at PHP ikke 'tager fejl'.




.HTML-fil


I HEAD-delen af alle HTML-filer skal indsættes:


<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
   eller
<meta content="charset=UTF-8">


Det kan afhænge af den anvendte editor, hvilken af de to der skal benyttes. Se iøvrigt 'Notepad++' nedenfor.




Notepad++


Med Notepad++ kan kontrolleres, om den anvendte editor producerer 'det rette UTF-8 format':


Notepad++
Format
Konverter til UTF-8 (uden BOM)

Hvis konverteringen medfører at filen opdateres og skal gemmes, skal den øverste / lange version af meta-dataene anvendes.


Når Notepad++ foretager konvertering, er det formentlig udtryk for, at filen har været kodet i et andet format end UTF-8 - formentligt 'UTF-8-BOM' også kaldet 'UTF-8N'.


Ved anvendelse af NetBeans som editor synes det nødvendigt at anvende den 'lange' version af metadataene. Notepad++ foretager da ingen konvertering, og æøå fra HTML-tekst vises ikke som krummelurer.




CSS


CSS-filer bør på deres allerførste linie have anført:

@charset "UTF-8";

Kompenserer for evt. manglende angivelse af meta-data i HTML-filernes HEAD-del.
























x
x