Codifica caratteri ISO o UFT o boh....

Linguaggi di programmazione: php, perl, python, C, bash, ecc.

Codifica caratteri ISO o UFT o boh....

Messaggioda lionalex » sabato 7 giugno 2008, 13:30

premetto che non so se questa è l'area giusta del forum, comunque espongo il problema:
Da poco sono passato ad UBUNTU. Solo che, lavorando nella costruzione di siti web, ho dovuto installare ECLIPSE con estenzione per il PHP.
Ho notato però che in LINUX molti caratteri non vengono decifrati correttamente, ad esempio tutte le lettere con gli accenti che avevo scritto in windows, con UBUNTU non vengono letti, per non parlare poi dei caratteri speciali tipo l'€...dopo vari smanettamenti mi sono reso conto che è una problematica di CODIFICA del CARATTERE. Ho scoperto che ad esempio in ECLIPSE se setto la codifica ISO, funziona tutto bene. Ora la mia domanda è: qual'è la codifica standard per tutti i BROWSER o SERVE per fare dei SITI WEB che vengano CORRETTAMENTE decifrati da qualsiasi sistema operativo??? Che differenza c'è tra ISO e gli altri sistemi di codifica? UFT ecc....
lionalex
Prode Principiante
 
Messaggi: 17
Iscrizione: maggio 2008

Re: Codifica caratteri ISO o UFT o boh....

Messaggioda Massimo S. » sabato 7 giugno 2008, 16:40

Non credo che esista una codifica standard, almeno non una sola.

Forse l'importante è che una pagina html dichiari il charset e che usi effettivamente quello dichiarato, ad esempio ho guardato il sorgente html della pagina del forum in cui sto scrivendo questo messaggio e nell'header c'è

Codice: Seleziona tutto
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />


Comunque in firefox, nel menu "Visualizza" si può anche impostare il charset da usare per visualizzare la pagina e anche attivare il riconoscimento automatico del charset


Sai cosa sono charset, sistemi di codifica ecc..? Se no trovi tutto su wikipedia.
Comunque un charset è un insieme di caratteri e una "associazione" che ad ogni carattere associa un un numero intero che può richiedere un certo numero di byte fisso o variabile per essere memorizzato.

ISO-8859-1 è un charset pensato per l'Europa Occidentale (e quindi anche per l'Italia), contiene i caratteri che servono per le lingue dei paesi dell'Europa Occidentale e mi pare che ad ogni carattere sia associato un intero da 0 a 255 e che quindi ogni carattere occupi sempre solo un byte

Per parlarti di UTF8 bisogna parlare prima di Unicode.
Unicode è un universale, contiene i caratteri di tutte le lingue della terra, ne esistono varie "implementazioni" che differiscono in quanti byte occupa un carattere.
Ad esempio UTF8 è un codifica Unicode in cui i caratteri più usati in occidente come le lettere dell'alfabeto latino (abc...ABC... ecc...) occupano un solo byte (8 bit da cui il nome UTF8) mentre altri caratteri possono occupare 2 e mi pare anche più byte.
Quindi in UTF8 la dimensione di un carattere in byte non è costante come in ascii, ISO-8859-1 o altre codifiche.
Avatar utente
Massimo S.
Entusiasta Emergente
Entusiasta Emergente
 
Messaggi: 1927
Iscrizione: settembre 2006

Re: Codifica caratteri ISO o UFT o boh....

Messaggioda lionalex » sabato 7 giugno 2008, 17:32

grazie mille, sei stato GRANDIOSO!!!  :D
Ora finalmente c'ho capito qualcosa  ;D
lionalex
Prode Principiante
 
Messaggi: 17
Iscrizione: maggio 2008

Re: Codifica caratteri ISO o UFT o boh....

Messaggioda ilnovi » sabato 7 giugno 2008, 22:55

Ciao, per esperienza Unicode è un po' una bestia nera.
Ho provato a buttare giù delle note su come, secondo me, è il miglior modo per introdurlo, senza entrare troppo negli inutili dettagli tecnici. Prova a darci uno sguardo:

http://www.carminenoviello.name/archives/44
ilnovi
Prode Principiante
 
Messaggi: 34
Iscrizione: ottobre 2007

Re: Codifica caratteri ISO o UFT o boh....

Messaggioda Massimo S. » domenica 8 giugno 2008, 2:03

lionalex ha scritto:grazie mille, sei stato GRANDIOSO!!!  :D


Troppo buono  ;D

ilnovi ha scritto:Ho provato a buttare giù delle note su come, secondo me, è il miglior modo per introdurlo, senza entrare troppo negli inutili dettagli tecnici. Prova a darci uno sguardo:

http://www.carminenoviello.name/archives/44


Interessanti le tue note, mi sembrano ben fatte, mi piace il tono "leggero" e scanzonato con cui le hai scritte.

Solo una cosa ... sei sicuro che l'encoding di default di Java è latin1 ?
Che io sappia, Java rappresenta interamente le stringhe in UTF16
Avatar utente
Massimo S.
Entusiasta Emergente
Entusiasta Emergente
 
Messaggi: 1927
Iscrizione: settembre 2006

Re: Codifica caratteri ISO o UFT o boh....

Messaggioda ilnovi » domenica 8 giugno 2008, 8:03

Massimo S. ha scritto:Solo una cosa ... sei sicuro che l'encoding di default di Java è latin1 ?
Che io sappia, Java rappresenta interamente le stringhe in UTF16


Ciao, ti ringrazio della precisazione. In realtà Java fa una cosa che non condivido molto: lascia questo parametro dipendente dalla piattaforma. Con questo snippet di codice si chiarisce tutto:

Codice: Seleziona tutto
import java.io.*;

public class Prova {
    public static void main(String[] args) {
         System.out.println(System.getProperty ("string.encoding"));
    }
}


E' possibile specificare alla riga di comando della JVM quale encoding adoperare con il parametro:

Codice: Seleziona tutto
java -Dfile.encoding=UTF8
ilnovi
Prode Principiante
 
Messaggi: 34
Iscrizione: ottobre 2007

Re: Codifica caratteri ISO o UFT o boh....

Messaggioda Massimo S. » domenica 8 giugno 2008, 15:01

Veramente a me il codice java che hai postato stampa sempre
Codice: Seleziona tutto
null


forse intendevi fare
Codice: Seleziona tutto
System.out.println(System.getProperty ("file.encoding"));

cioè file.encoding invece di string.encoding ?

Comunque ribadisco che, che io sappia, Java rappresenta internamente le stringhe in UTF-16
Però quando legge/scrive stringhe da/verso un file allora usa un altro encoding che è quello della proprietà file.encoding

Credo che il valore di file.encoding di default dipende dalla piattaforma, come hai detto tu, ma non nel senso che su un sistema operativo usa un encoding e su un altro ne usa un altro, me è settato in base all'encoding e al Locale impostato sul Sistema Operativo.

Ad esempio su Ubuntu la variabile di ambiente LANG è settata a "it_IT.UTF-8"
Se cambi il valore di questa variabile, cambierà anche il valore di default che Java assegna a file.encoding
Avatar utente
Massimo S.
Entusiasta Emergente
Entusiasta Emergente
 
Messaggi: 1927
Iscrizione: settembre 2006

Re: Codifica caratteri ISO o UFT o boh....

Messaggioda ilnovi » domenica 8 giugno 2008, 16:44

Massimo S. ha scritto:Comunque ribadisco che, che io sappia, Java rappresenta internamente le stringhe in UTF-16
Però quando legge/scrive stringhe da/verso un file allora usa un altro encoding che è quello della proprietà file.encoding

Credo che il valore di file.encoding di default dipende dalla piattaforma, come hai detto tu, ma non nel senso che su un sistema operativo usa un encoding e su un altro ne usa un altro, me è settato in base all'encoding e al Locale impostato sul Sistema Operativo.

Ad esempio su Ubuntu la variabile di ambiente LANG è settata a "it_IT.UTF-8"
Se cambi il valore di questa variabile, cambierà anche il valore di default che Java assegna a file.encoding


In un delirio di prove ho copiato lo snippet sbagliato. Si, è file.encoding. Per quanto riguarda il discorso "dipendente dalla piattaforma" è ovvio che sto parlando del locale per quel dato sistema operativo. Per motivi ai più ancora sconosciuti, Windows si ostina a settare per le versioni Western Europe (quindi, USA compresi) il default locale a cp1252, un suo codepage che è un sovrainsieme di ISO-8859-1, mentre ormai tutto il mondo usa UTF-8.
Per la questione Java, dubito che in memoria converta tutto in UTF-16, sia perché significa impiegare esattamente il doppio di memoria rispetto ad UTF-8 e mediamente il quadruplo rispetto a cp1252, con ovvie ripercursioni sulle performance, sia perché le basta tenere le stringhe rappresentate come stringhe unicode idealizzate, e poi encodarle al momento opportuno. Ma ammetto che non sono un programmatore Java.
Inoltre, di Java non condivido l'approccio di settare il default encoding a quello del sistema: se non si gestisce BENE questa cosa, dà luogo a programmi che sono scarsamente portabili. Mi spiego: tu progetti la tua applicazione su Windows, gestendo dati nell'encoding di default che è cp1252. Quando la porti su Linux, se porti pure i dati sono dolori se non gestisci opportunamente la conversione. Molto meglio fare come Python: fissa come encoding base ASCII che è comune a tutti i codec. Poi è responsabilità del programmatore gestire esplicitamente quale encoding usare per i suoi dati. Non a caso, tutti i problemi che tipicamente si hanno con i programmi Python mal progettati nascono dal fatto di aver modificato il file site.py, dove è settato questo parametro.
Ultima modifica di ilnovi il domenica 8 giugno 2008, 16:50, modificato 1 volta in totale.
ilnovi
Prode Principiante
 
Messaggi: 34
Iscrizione: ottobre 2007

Re: Codifica caratteri ISO o UFT o boh....

Messaggioda Massimo S. » domenica 8 giugno 2008, 16:52

ilnovi ha scritto:Per la questione Java, dubito che in memoria converta tutto in UTF-16, sia perché significa impiegare esattamente il doppio di memoria rispetto ad UTF-8 ...


Si ogni carattere in java occupa 2 byte in memoria.
La codifica interna è UTF-16

A String represents a string in the UTF-16 format

Citato da http://java.sun.com/j2se/1.5.0/docs/api/java/lang/String.html
Avatar utente
Massimo S.
Entusiasta Emergente
Entusiasta Emergente
 
Messaggi: 1927
Iscrizione: settembre 2006

Re: Codifica caratteri ISO o UFT o boh....

Messaggioda ilnovi » domenica 8 giugno 2008, 17:23

Ok. Giusto così.
Grazie per la segnalazione, ho aggiornato il mio articolo segnalando questo post  ;)
ilnovi
Prode Principiante
 
Messaggi: 34
Iscrizione: ottobre 2007


Torna a Programmazione

Chi c’è in linea

Visualizzano questa sezione: 0 utenti registrati e 2 ospiti