UTF-8 e caratteri sbagliati

Volete che il vostro sito supporti le lettere accentate e i caratteri speciali, senza che sia necessario ricorrere agli shortcut del iso-8895-1? Perfetto: basta usare la tabella dei caratteri chiamata UTF-8.

Farlo è decisamente semplice, ma è necessario porre attenzione ad un paio di cose. La prima è che bisogna impostare nei meta tag il charset, ovvero proprio la tavola di codifica dei caratteri:

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

Ma questo non basta. E' necessario che il server web (IIS / APACHE) e in particolare la configurazione del sito, sia impostata per erogare pagine in quel formato, indicandolo nel protocollo. Per fare questo o accedete alle impostazioni del server, oppure tramite i linguaggi server side, potete impostarlo.

Vi presento come farlo per i principali linguaggi di scripting: Coldfusion, PHP, ASP. 

 

UTF in Coldfusion

In  Coldfusion il content-type si setta con l'istruzione:

<cfprocessingdirective pageencoding="utf-8" >
<cfcontent type="text/html; charset=utf-8">

Nota bene: è fondamentale che le due iscruzioni siano in testa alla pagina, prima di ogni altra cosa. Se avete un file Application.cfm nella cartella, deve essere nella riga 1 di quel file. In aggiunta potete inserire anche:

 

<cfscript> 
SetEncoding("form","utf-8"); 
SetEncoding("url","utf-8"); 
</cfscript>

Per approfondire consiglio la lettura di How to enable unicode in Coldfusion.

 

UTF in PHP

In PHP invece si usa questa istruzione:

<?php header('Content-Type: text/html; charset=utf-8'); ?>

 

 

UTF in ASP / ASP.NET

E in ASP / ASP.NET questa:

<%Response.charset="utf-8"%>

Se ne volete sapere di più consiglio la lettura di O-HTTP-CHARSET.

Loading Facebook Comments ...

15 pensieri su “UTF-8 e caratteri sbagliati

  1. Francesco

    La gestione delle lettere accentate e’ davvero un calvario per noi poveri sviluppatori. Pensa che forzo l’UTF-8 in tutti i modi … anche con Spring nel mio web.xml in questo modo:

    <filter>
    <filter-name>CharacterEncodingFilter</filter-name>
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
    <init-param>
    <param-name>encoding</param-name>
    <param-value>UTF-8</param-value>
    </init-param>
    <init-param>
    <param-name>forceEncoding</param-name>
    <param-value>true</param-value>
    </init-param>
    </filter>

    E a volte non basta …

    Rispondi
  2. Merlinox Autore articolo

    Infatti @Francesco la cosa non è molto chiara. Ad esempio coldfusion nativamente pubblica in UTF-8, ma ti garantisco che in un sito le ho provate tutte, senza risultato. Alla fine ho messo il meta a iso-8859-1, in modo che dreamweaver lo riconoscesse. Quindi fatto copia e incolla di tutti i testi, in modo che DW li convertisse nella notifica standard. Vitaccia…

    Rispondi
  3. Giovanni

    L’UTF-8 va impostato prima di tutto su Apache, poi su MySQL sia nelle tabelle che nelle connessioni, poi su PHP possibilmente sul file php.ini, altrimenti in questo modo:

    ini_set(‘default_charset’, ‘utf-8’);

    L’istruzione dell’articolo infatti non imposta la codifica di PHP ma manda un header HTML, cosa che non serve se dopo nel documento abbiamo il metatag. Laddove non si ha l’accesso alle impostazioni di MySQL, si può dare questa query in PHP prima di tutte le altre:

    mysql_query(“SET NAMES ‘utf8′”);

    Ma ancora così può non bastare! Se abbiamo salvato il nostro documento con una codifica diversa, avremo di nuovo il maledetto quadratino nero con il punto interrogativo dentro, segno di un carattere UTF-8 non riconosciuto.

    Con questo ho coperto tutti i possibili casi: non ce ne sono altri.

    Quando invece al posto di una lettera accentata abbiamo DUE lettere esotiche, è il sintomo che i dati sono in UTF-8, mentre invece è stata dichiarata un’altra codifica.

    Rispondi
  4. Joel

    Hola,

    @Merlinox da un occhio al blog con chrome, il layout è sputtanatissimo dal fine dell’articolo al fondo :-S

    @Giovanni & @All io in PHP uso sempre utf8_decode & utf8_encode, oltre all’header html dell’articolo e le impostazioni nel DB. Purtroppo il php.ini non me lo fanno toccare nel mio hosting, -__- devo decidermi a switchare su un virtuale/dedicato…

    Rispondi
  5. Merlinox Autore articolo

    O porca paletta… non so cosa diavolo sia successo @joel! Mannaggia… uff… io non ho toccato nulla, sarà qualche plugin! Mi dai una mano?

    Rispondi
  6. Joel

    Prova a disabilitare i plugin uno alla volta per trovare il “colpevole”.

    In fondo al sito ho trovato questo:

    height non è chiuso
    l’apice di chiusura dell’alt è sbagliato, non è un ” ma un ”
    dopo border c’è un pelo di confusione

    Non penso sia il colpevole ma correggere un errorino non fa mai male… il codice del blog è parecchio incasinato, non trovo l’errore, ma sembra che sia nel navbar.

    Rispondi
  7. pepe68

    ciao sto impazzendo ed ho provato di tutto, sapreste indicarmi su questo codice come posso fare per la codifica dei caratteri speciali?

    <%
    ' Session.CodePage=65001
    ' Response.Charset="UTF-8"
    ' Response.ContentType = "text/xml"

    On Error Resume Next

    Dim database, nome, id

    Dim contatore, pag, quanti, inizio, fine

    pag = Request.QueryString("pag")
    If IsNumeric(pag) = False Or pag < 1 Then pag = 1

    quanti = 5

    Set database = Server.CreateObject("Microsoft.XMLDOM")

    database.Async = False
    database.Load Server.MapPath("db/bookmark.xml")

    Set id = database.getElementsByTagName("utente/id")
    Set nome = database.getElementsByTagName("utente/nome")

    If pag = 1 Then
    inizio = 1
    fine = quanti
    Else
    inizio = ((pag * quanti) – quanti) + 1
    fine = Round((quanti / 2) + inizio)
    End If

    With Response
    For contatore = inizio To fine
    .Write "”
    .Write id(contatore – 1).Text & “. ”
    .Write nome(contatore – 1).Text
    .Write “”
    Next
    End With

    contatore = 1

    With Response
    .Write “”
    For contatore = 1 To Round(nome.Length / quanti)
    If CInt(contatore) = CInt(pag) Then
    .Write “[” & contatore & “] ”
    Else
    .Write “[
    .Write contatore
    .Write “
    ] ”
    End If
    Next
    .Write “”
    End With

    Set nome = Nothing
    Set database = Nothing
    %>

    Rispondi

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *