Discussione:
UTF-8 ASCII ed entità HTML
(troppo vecchio per rispondere)
Francesco D'Aguanno
2005-07-29 09:56:03 UTC
Permalink
NB: ho pubblicato lo stesso messaggio su "it.comp.www.asp" perchè non
so quale dei due gruppi sia più idoneo.

Sto scrivendo una funzione che permetta di normalizzare una stringa
secondo la codifica UTF-8, ma non ci sto capendo un granché.
A me sembra che non esista un vero e proprio standard: ho l'impressione
che ognuno faccia come gli pare!

Alla fine ho deciso di fare così:
- I caratteri da 0 a 31 li elimino dalla stringa
- Il carattere 32 (spazio) lo sostituisco con " " (a meno che non
desideri che all'interno della cella si possa andare a capo: " "
non manda a capo)
- Lettere minuscole, lettere maiuscole e numeri li utilizzo così come
sono

Dal carattere 32 in poi ho i seguenti dubbi:
1) Per quanto riguarda i caratteri fino a 127 (i cui ASCII vengono
riconosciuti dalla codifica UTF-8) è preferibile mantenere l'ASCII o
è meglio utilizzare codici (&#codice;) e/o (se esistenti) le entità
(≶ < ...)
2) Per quanto riguarda i caratteri da 127 a 255 (i cui ASCII non sono
riconosciuti dalla codifica UTF-8) conviene chiamarli con il codice
(&#codice;) o, se esistenti, con le entità (À é ...)?

Spero di essere stato il più chiaro possibile...

Grazie a tutti.

PS: Terminata la scrittura (se lo riterrete utile), pubblicherò la
funzione... Ditemi solo dove farlo (per evitare di essere OT).
Umberto Salsi
2005-07-29 11:28:34 UTC
Permalink
Post by Francesco D'Aguanno
NB: ho pubblicato lo stesso messaggio su "it.comp.www.asp" perchè non
so quale dei due gruppi sia più idoneo.
Allora, secondo me, era meglio fare un cross-post che un multipost.
Post by Francesco D'Aguanno
Sto scrivendo una funzione che permetta di normalizzare una stringa
secondo la codifica UTF-8, ma non ci sto capendo un granché.
Visto che non ci spieghi cosa significa "normalizzare una stringa UTF-8"
il resto non so quanto senso abbia.
Post by Francesco D'Aguanno
A me sembra che non esista un vero e proprio standard: ho l'impressione
che ognuno faccia come gli pare!
Standard di cosa? La codifica UTF-8 sta nell RFC 2279, e codifica il
charset ISO-non-mi-ricordo che c'e' scritto li'. Nulla e' lasciato al
caso. Se vuoi proteggerti dalle sequenze di byte "malevole", e' discusso
anche questo nell'RFC, e in genere si risolve in una riga di programma.
Post by Francesco D'Aguanno
- I caratteri da 0 a 31 li elimino dalla stringa
Ci sarebbero anche il CR e LF che sono validi in una <TEXTAREA>.
Post by Francesco D'Aguanno
- Il carattere 32 (spazio) lo sostituisco con "&nbsp;" (a meno che non
desideri che all'interno della cella si possa andare a capo: "&nbsp;"
non manda a capo)
- Lettere minuscole, lettere maiuscole e numeri li utilizzo così come
sono
Qui non ti seguo perche' quello che vuoi fare lo sai solo tu.

Ciao,
___
/_|_\ Umberto Salsi
\/_\/ www.icosaedro.it
Francesco D'Aguanno
2005-08-01 09:39:10 UTC
Permalink
Post by Umberto Salsi
Allora, secondo me, era meglio fare un cross-post che un multipost.
Non sapevo la differenza fra cross-post e multipost.
Ora la so.
Grazie.
Post by Umberto Salsi
Visto che non ci spieghi cosa significa "normalizzare una stringa UTF-8"
il resto non so quanto senso abbia.
Per normalizzare indendo: analizzare la stringa ed eventualmente
sostituire con codici appropriati i caratteri non supportati dallo
standard (ad esempio i codici ASCII superiori a 127)
Post by Umberto Salsi
Standard di cosa? La codifica UTF-8 sta nell RFC 2279, e codifica il
charset ISO-non-mi-ricordo che c'e' scritto li'. Nulla e' lasciato al
caso. Se vuoi proteggerti dalle sequenze di byte "malevole", e' discusso
anche questo nell'RFC, e in genere si risolve in una riga di programma.
La codifica è standard, ma i S/O, le tastiere, ed i software non
sempre la supportano correttamente. Comunque può darsi che sia solo un
problema di ignoranza da parte mia.
Post by Umberto Salsi
Ci sarebbero anche il CR e LF che sono validi in una <TEXTAREA>.
Avevo dimenticato: sostituisco il VbCrLf con <BR> se va in HTML, mentre
lo lascio tale e quale se va in una <TEXTAREA> o in un <INPUT>.
Post by Umberto Salsi
Qui non ti seguo perche' quello che vuoi fare lo sai solo tu.
Sto sostituendo tutti i caratteri ASCII (quando possibile) con enetità
HTML o codici del tipo &#0065; etc etc.
I numeri e le lettere non li sostituisco.

Forse non mi capisci, perché non riesco a spiegarmi bene.
Forse non riesco a spiegarmi bene perché neanch'io ho ben chiara la
situazione.

Però continuo...


Ciao e grazie...
j
2005-08-03 14:27:34 UTC
Permalink
Post by Francesco D'Aguanno
Post by Umberto Salsi
Visto che non ci spieghi cosa significa "normalizzare una stringa UTF-8"
il resto non so quanto senso abbia.
Per normalizzare indendo: analizzare la stringa ed eventualmente
sostituire con codici appropriati i caratteri non supportati dallo
standard (ad esempio i codici ASCII superiori a 127)
Guarda che la cosa non è chiara: un file HTML salvato in formato UTF-8
supporta tutti i caratteri dell'UTF-8. Se il webserver invia un header
UTF-8, la pagina vedrà tutti i caratteri che vuoi, anche senza usare le
entity.
Post by Francesco D'Aguanno
Post by Umberto Salsi
Standard di cosa? La codifica UTF-8 sta nell RFC 2279, e codifica il
charset ISO-non-mi-ricordo che c'e' scritto li'.
Nulla e' lasciato al
caso. Se vuoi proteggerti dalle sequenze di byte "malevole", e' discusso
anche questo nell'RFC, e in genere si risolve in una riga di programma.
Sì ma questo non ha a che fare con UTF o i charset, ma con il programma
che riceve i caratteri - una bella regular expression e tutto si risolve.
Post by Francesco D'Aguanno
La codifica è standard, ma i S/O, le tastiere, ed i software non
sempre la supportano correttamente. Comunque può darsi che sia solo un
problema di ignoranza da parte mia.
Sì in questo caso è un problema di chi usa la tecnologia :-D
Post by Francesco D'Aguanno
Post by Umberto Salsi
Ci sarebbero anche il CR e LF che sono validi in una <TEXTAREA>.
Avevo dimenticato: sostituisco il VbCrLf con <BR> se va in HTML, mentre
lo lascio tale e quale se va in una <TEXTAREA> o in un <INPUT>.
Aiuto!
VbCrLF ovvero Visual Basic Carriage Return e Line Feed sono due CHAR.
Un CR (ascii 13) e un LF (ascii 10).
In entity si possono scrivere con &#0013; e &#0010;

I due caratteri, nel file, occupano 2 byte da 8 bit in ascii e in UTF-8.
In un file HTML, un CR+LF non si vedono e la riga non và accapo.

Per capirci: se batti invio in un file di testo normale, avrai 2 byte in
windows.1 solo in linux (l'LF se non ricordo male).
Se vuoi quei due caratteri in un file HTML hai due possibilità:
- apri il file e premi invio
- apri il file e ci scrivi dentro le due entity &#0013; e &#0010;

Ovviamente la dimensione in BYTE del file è diversa: uno occupa 2 byte
(più eventuali BOM all'inizio del file) l'altro occuperà 14 byte (più i
soliti eventuali BOM).

Quando aprirai il file dal browser, "vedrai" un accapo (impercettibile
perchè in realtà in "linguaggio" HTML è il <BR /> che manda accapo).
Qualsiasi cosa tu fisicamente veda o non veda (sono caratteri
invisibili), il tuo browser rappresenterà a monitor due caratteri: il CR
e l'LF.

Se poi decidi di salvare il file in formato UTF-16 e non UTF-8 le
dimensioni in byte NON saranno le stesse, ma vedrai la stessa roba e
avrai gli stessi risultati.
Questo perchè UTF-16 usa un numero diverso di bit per ogni carattere.

Il <BR /> è un "comando" che rappresenta un accapo grafico, un BREAK
LINE e non ha significato diverso da <A> <IMG> o simili tag. Non c'è
quindi equivalenza tra il "comando" <BR> e CR+LF che sono due caratteri.

Se vuoi fare una 'conversione' tieni poi presente che l'accapo in
windows è fatto dai due caratteri, ma in linux da uno solo - quindi come
converti veramente ? :D
Post by Francesco D'Aguanno
Sto sostituendo tutti i caratteri ASCII (quando possibile) con enetità
HTML o codici del tipo &#0065; etc etc.
E' sempre possibile convertire un carattere nella sua corrispondente
entità, se tale carattere ha un codice esadecimale nella tabella degli
UTF-8 (praticamente tutti a parte alcuni cinesi tradizionali di cui non
penso ti preoccupi).
Anzi, fare la conversione TOTALE è la cosa migliore - certo che per
farlo devi poter leggere il file originale con un ambiente che sia
Unicode enabled. VB non mi pare che lo sia. .NET sì.
Java sì, Php in alcune circostanze (la lettura dei file è binary safe).
Post by Francesco D'Aguanno
I numeri e le lettere non li sostituisco.
E perchè no ?
Post by Francesco D'Aguanno
Forse non mi capisci, perché non riesco a spiegarmi bene.
Forse non riesco a spiegarmi bene perché neanch'io ho ben chiara la
situazione.
Però continuo...
Ciao e grazie...
Ma in che linguaggio lo stai facendo sto lavoraccio ?
Sicuro tu non stia sprecando un sacco di tempo per una cosa che non ha
ragione di esistere ?

Ciao

j
2005-08-02 15:40:32 UTC
Permalink
Post by Francesco D'Aguanno
NB: ho pubblicato lo stesso messaggio su "it.comp.www.asp" perchè non
so quale dei due gruppi sia più idoneo.
Cerca su http://unicode.thecloud.org ci sono un po' di faq in italiano
su unicode e i caratteri.

La codifica dei caratteri in UTF-8 utilizza un algoritmo ben preciso a
lunghezza variabile che trovi sul sito che ti ho segnalato, ma secondo
me è una follia farlo a mano.

Mi sembra però di capire che tu stia cercando di trasformare una stringa
che rappresenti con caratteri in un certo encoding (iso-8859-1 ?) a UTF-8.

Solitamente i linguaggi web tipo php hanno una funzione apposita che
esegue la conversione http://it2.php.net/manual/en/function.utf8-encode.php
Post by Francesco D'Aguanno
Sto scrivendo una funzione che permetta di normalizzare una stringa
secondo la codifica UTF-8, ma non ci sto capendo un granché.
A me sembra che non esista un vero e proprio standard: ho l'impressione
che ognuno faccia come gli pare!
Uhm no è che con Unicode molti pensano di saperla lunga ma in verità
l'argomento è parecchio complesso. Io ci ho studiato un sacco ma ancora
non ci capisco molto :-D
Post by Francesco D'Aguanno
- I caratteri da 0 a 31 li elimino dalla stringa
- Il carattere 32 (spazio) lo sostituisco con "&nbsp;" (a meno che non
desideri che all'interno della cella si possa andare a capo: "&nbsp;"
non manda a capo)
- Lettere minuscole, lettere maiuscole e numeri li utilizzo così come
sono
Aspetta aspetta che casino! Stai cercando di convertire il tutto in
ENTITIES XML ? Che centra tutto sto papocchio sull' UTF allora ?

In php la funzione htmlentities oppure rawurlencode fà quello che cerchi.
Post by Francesco D'Aguanno
1) Per quanto riguarda i caratteri fino a 127 (i cui ASCII vengono
riconosciuti dalla codifica UTF-8) è preferibile mantenere l'ASCII o
è meglio utilizzare codici (&#codice;) e/o (se esistenti) le entità
(&lg; &lt; ...)
Ma non centra nulla UTF con le entity!!
Oh mamma che casino :-D
Allora:
- i caratteri dallo ASCII 0 al 127 sono uguali agli UTF
Poi in HTML ogni carattere può essere rappresentato da:
- il carattere nel suo encoding
- una entity binaria &#XXXX; dove XXXX è l'esadecimale
- una costante

Esempio:
Il carattere & può essere rappresentato, in una pagina HTML, da:
- il carattere & digitato tramite tastiera
- la entity 'costante' &amp;
- la entity esadecimale &#0038;

Questo non ha nulla a che fare con UTF-8 perchè in un file in UTF-8
posso scrivere & e lo posso scrivere anche in un file ISO.
Post by Francesco D'Aguanno
2) Per quanto riguarda i caratteri da 127 a 255 (i cui ASCII non sono
riconosciuti dalla codifica UTF-8) conviene chiamarli con il codice
(&#codice;) o, se esistenti, con le entità (&Agrave; &eacute; ...)?
In UTF-8 i caratteri dopo il 128esimo cambiano modo di essere rappresentati.
Attualmente UTF-8 (UTF-16 non è usato) è l'encoding che rappresenta il
maggior numero di caratteri quindi mi sa che qualcosa non torna.
Post by Francesco D'Aguanno
Spero di essere stato il più chiaro possibile...
Fai una cosa... leggi qui poi ri-posta la domanda, scommetto che non
avrai le idee più chiare ma almeno comprenderai che la tua domanda è un
po' strana :-D
http://www.linkas.it/docs/unicode_e_UTF-8.html
Post by Francesco D'Aguanno
Grazie a tutti.
PS: Terminata la scrittura (se lo riterrete utile), pubblicherò la
funzione... Ditemi solo dove farlo (per evitare di essere OT).
Spero di no :-D
Nessuno capirebbe :D
Loading...