[Python] It's 1999 all over again
Manlio Perillo
manlio.perillo a gmail.com
Gio 13 Feb 2014 20:39:48 CET
On 13/02/2014 17:03, Daniele Varrazzo wrote:
> On 2014-02-13 15:22, Manlio Perillo wrote:
>> On 13/02/2014 16:07, Daniele Varrazzo wrote:
>
>>> - sei legato all'implementazione del carattere (char, utf16, utf32)
>>
>> Direi che lo stesso problema è presente, in parte, con Go:
>> http://golang.org/ref/spec#String_types
>
> Il problema è risolto dal fatto che hanno dichiarato che le stringhe
> sono solo 8 bit e sono solo codificate in utf8, mentre l'accesso ai
> codepoint unicode ha un'interfaccia separata.
Che è quello che puoi ottenere anche in C.
> Questo porta alle
> conseguenze che:
>
> - sono più efficienti in memoria di utf16/32
Sicuramente, ma che succede se io non ho problemi di memoria e mi
interessa invece l'efficienza di esecuzione dei vari algoritmi che
operano sulle stringhe? Come scritto tempo fa, questo è proprio uno dei
problemi di Go: ha delle "regole" imposte dal creatore del linguaggio,
mentre io preferisco la filosofia del C in cui il programmatore sa
quello che fa ed il linguaggio deve lasciarglielo fare permettendo anche
di farlo in modo efficiente.
> - sai che a[n] non è un carattere ma è un byte. La bugia dei widechar
> non regge. Neanche quella di unicode in python che però si rompe al di
> fuori del BMP (a meno che non lo compili 4 byte per carattere blah blah)
Per quello che ne so, puoi usare la rappresentazione che vuoi per una
stringa (1 byte UTF-8, 2 byte UTF-16, 4 byte UTF-32), e se l'API è
corretta non dovrebbe rompersi in nessun caso.
Al momento non ricordo il problema specifico di Python; mi confermi che
dipende interamente dal fatto di aver scelto 2 bytes, oppure se è un bug
o problema di API esposta?
> - tipicamente l'i/o non richiede encoding/decoding
L'I/O di stringhe direi che *richiede* encoding, almeno fino a quando
UTF-8 non sarà disponibile ovunque. E' da molto che non uso Windows, ma
in XP mi sembra che UTF-8 non lo potevi impostare come encoding di sistema.
> [...]
>
> Conoscere il numero di caratteri di una
> stringa è un'altra operazione largamente sopravvalutata (non scrivi
> tutti i giorni un algoritmo per centrare una stringa di caratteri non
> proporzionali in uno schermo).
Vero, ma non vedo perchè quei pochi casi non possano essere ottimizzati
scegliendo una rappresentazione alternativa, se uno lo ritiene necessario.
> Molti algoritmi possono essere espressi
> con un'iterazione sull'input che dura fino al verificarsi di una certa
> condizione (fine dell'input, o altro): per questi non ti serve la
> lunghezza.
>
> Quanti caratteri è lungo:
>
> <html>世界</html>
>
> dipende dal contesto, no?
Dipende anche da che intendi per carattere.
Sono 2 caratteri, ed N bytes con N che dipende dalla rappresentazione
interna della stringa.
> [...]
> È un linguaggio opinionato: quando incontra gente opinionata può piacere
> o non piacere :) Trovo la scelta di avere stringhe solo utf8 molto
> razionale nel 201x, anche se richiede aggiustamenti mentali rispetto ad
> abitudini prese nel 197x. Ma allora non esistevano i cinesi, né le
> lettere accentate, né l'€, quindi è comprensibile...
>
Io non ho nulla contro la scelta di avere le stringhe UTF-8 (che, come
dici, è perfettamente condivisibile), ho qualche dubbio sul fatto di
offrire *solo* quella. Ovviamente non parlo della babele che abbiamo
adesso ad esempio con la gestione delle stringhe in Ruby o PostgreSQL,
ma almeno avrei seguito la strada di D ed offerto tipi diversi di
stringhe in base alle rappresentazioni Unicode standard.
Ciao Manlio
Maggiori informazioni sulla lista
Python