On 2014-02-14 11:08, Manlio Perillo wrote:
On 14/02/2014 00:34, Daniele Varrazzo wrote:
On 2014-02-13 18:50, Dario Bertini wrote:
On 02/13/2014 05:03 PM, Daniele Varrazzo wrote:
- 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)
Forse sono pignolo, ma "la bugia dei widechar non regge" non vuol
dire
quasi nulla visto che:
- non specifichi cos'è un widechar (è un codeunit a 16 bit, o un
codepoint memorizzato in 32?)
- non chiarisci in che modo non regge
wchar_t è compiler dependent: potrebbe essere anche 8 bit. Tanto per
essere utile.
E' vero che è implementation defined, ma lo standard C99 dice:
wide character
bit representation that fits in an object of type wchar_t, capable of
representing any character in the current locale
Ora, assumendo che il locale corrente permette di gestire l'intero
Unicode, una implementazione corretta dovrebbe avere un wchar_t di 4
octets.
Il fatto che Windows (che assumo/spero supporti l'intero Unicode) ha
una rappresentazione di wchar_t come 2 octets, significa che o io
interpreto male lo standard o Windows non è conforme.
Credo tu non l'abbia interpretato bene. "any character in the current
locale" si esprime a sufficienza in UTF16, perché il BMP (Basic
Multilingual Plane, ovvero i codepoint tra 0000 e FFFF) contengono tutti
gli alfabeti correnti. Gli altri codepoint (da 010000 a 10FFFF, i "piani
astrali") contengono simboli speciali e caratteri antichi, niente che
possa essere necessario in alcun "locale" corrente.
https://en.wikipedia.org/wiki/Plane_(Unicode)#Supplementary_Multilingual_Plane
La scelta di Microsoft è conforme finché non verrà chiesto un locale in
cuneiforme o in geroglifici meroitici, che richiederebbero UTF32 per
essere rappresentati /in un singolo wchar_t/. La scelta è pragmatica,
tipica di mamma MS.
Nota che usare wchar_t a 16 bit non impedisce a un programma in C di
esprimere tutto l'unicode: I caratteri al di fuori del BMP si possono
rappresentatre usando "coppie surrogate". Quello che salta è l'identità
1 wchar_t == 1 codepoint, quindi ancora accesso o(1) al carattere N e
proporzionalità tra numero di caratteri e lunghezza del buffer.
https://en.wikipedia.org/wiki/Mapping_of_Unicode_characters#Surrogates
Usando i surrogate block è possibile scrivere un documento che mischi
lingue correnti e paperelle egiziane anche con wchar_t a 16 bit. Essere
un locale credo sia una proprietà più forte, ma non conosco lo standard
C99.
-- Daniele
_______________________________________________
Python mailing list
Python@lists.python.it
http://lists.python.it/mailman/listinfo/python