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

Rispondere a