[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