[Python] It's 1999 all over again

Daniele Varrazzo piro a develer.com
Mar 18 Feb 2014 13:41:20 CET


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



Maggiori informazioni sulla lista Python