Wchar_t è necessario per il supporto Unicode?

Il tipo wchar_t richiesto per il supporto Unicode? In caso contrario, qual è il punto di questo tipo multibyte? Perché dovresti usare wchar_t quando potresti realizzare la stessa cosa con char ?

No.

Tecnicamente, no. Unicode è uno standard che definisce i punti di codice e non richiede una codifica particolare.

Quindi, è ansible utilizzare unicode con la codifica UTF-8 e quindi tutto si adatterebbe in una o una breve sequenza di oggetti char e sarebbe anche ancora terminato con null.

Il problema con UTF-8 e UTF-16 è che s[i] non è necessariamente un personaggio, potrebbe essere solo un pezzo di uno, mentre con caratteri sufficientemente ampi puoi conservare l’astrazione che s[i] è un carattere singolo, tuttavia non crea stringhe di lunghezza fissa in varie trasformazioni.

Gli interi a 32 bit sono almeno sufficientemente ampi da risolvere il problema del punto di codice, ma non gestiscono ancora i casi d’angolo, ad esempio, l’aggiornamento di qualcosa può modificare il numero di caratteri.

Quindi si scopre che il problema x[i] non è completamente risolto anche da char32_t, e quelle altre codifiche rendono poveri i formati di file.

Il tuo punto implicito, quindi, è abbastanza valido: wchar_t è un errore, in parte perché Windows ne ha fatto solo 16 bit, e in parte perché non risolveva ogni problema ed era orribilmente incompatibile con l’astrazione del stream di byte.

Non hai assolutamente bisogno di wchar_t per supportare Unicode nel software, infatti usare wchar_t rende ancora più difficile perché non sai se “wide string” è UTF-16 o UTF-32 – dipende dal SO: sotto windows utf- 16 tutti gli altri utf-32.

Tuttavia, utf-8 consente di scrivere facilmente software abilitato per Unicode (*)

Vedi: https://stackoverflow.com/questions/1049947/should-utf-16-be-considered-harmful

(*) Nota: sotto Windows devi ancora usare wchar_t perché non supporta le versioni locali di utf-8, quindi per la programmazione Windows abilitata agli Unicode devi usare l’API basata su wchar.

wchar_t NON è assolutamente richiesto per Unicode. Ad esempio, UTF-8 mantiene la compatibilità con ASCII e utilizza un semplice char 8 bit. wchar_t fornisce principalmente supporto per i cosiddetti caratteri multi-byte, o in pratica qualsiasi set di caratteri che è codificato usando più della dimensione di sizeof(char) .

Come già notato, wchar_t non è assolutamente necessario per il supporto Unicode. Non solo, è anche assolutamente inutile a tale scopo, poiché lo standard non fornisce alcuna garanzia di dimensione fissa per wchar_t (in altre parole, non si sa in anticipo quale dimensione di (wchar_t) sarà su un particolare sistema), mentre sizeof (char) sarà sempre 1.

In una codifica UTF-8, qualsiasi carattere UNICODE effettivo viene mappato su una sequenza di uno o più (fino a quattro, credo) ottetti. In una codifica UTF-16, qualsiasi carattere UNICODE effettivo viene mappato su una sequenza di uno o più (fino a due, credo) parole a 16 bit. In una codifica UTF-32, qualsiasi carattere UNICODE effettivo viene mappato esattamente su una parola a 32 bit.

Come potete vedere, wchar_t potrebbe essere di qualche utilità per implementare il supporto UTF-16 SE lo standard è abbastanza bello da garantire che wchar_t sia sempre largo 16 bit. Sfortunatamente no, quindi dovresti ripristinare un tipo intero a larghezza fissa da (come std :: uint16_t).

  

La cosa più irritante è l’ulteriore confusione causata dalle configurazioni di compilazione di Microsoft Visual Studio UNICODE e MBCS (set di caratteri multibyte). Entrambi questi sono

A) confusionario e B) una menzogna vera e propria

poiché nemmeno una configurazione “UNICODE” in Visual Studio fa nulla per acquistare il supporto Unicode effettivo del programmatore, la differenza implicita in queste 2 configurazioni di build non ha alcun senso. Per spiegare, Microsoft consiglia di utilizzare TCHAR invece di utilizzare direttamente char o wchar_t. In una configurazione MBCS, TCHAR si espande in char, il che significa che è ansible utilizzarlo per implementare il supporto UTF-8. In una configurazione UNICODE, si espande in wchar_t, che in Visual Studio sembra essere largo 16 bit e potrebbe potenzialmente essere utilizzato per implementare il supporto UTF-16 (che, per quanto ne so, è la codifica nativa utilizzata da Windows) . Tuttavia, entrambe queste codifiche sono set di caratteri multibyte, poiché sia ​​UTF-8 che UTF-16 consentono la possibilità che un particolare carattere Unicode possa essere codificato come più di un solo char / wchar_t rispettivamente, quindi il termine multi-byte set di caratteri (a differenza del set di caratteri a byte singolo?) ha poco senso.

Per aggiungere la beffa al danno, il semplice utilizzo della configurazione Unicode non fornisce in realtà un limite di supporto Unicode. Per ottenerlo, devi usare una vera libreria Unicode come ICU ( http://site.icu-project.org/ ). In breve, il tipo wchar_t e le configurazioni MBCS e UNICODE di Microsoft non aggiungono nulla di utile e causano inutili confusioni, e il mondo sarebbe un posto significativamente migliore se nessuno di loro fosse mai stato inventato.

  

wchar_t non è richiesto. Non è nemmeno garantito avere una codifica specifica. Il punto è fornire un tipo di dati che rappresenti i caratteri larghi nativi del sistema, simile al carattere che rappresenta i caratteri nativi. Su Windows, ad esempio, è ansible utilizzare wchar_t per accedere alle funzioni API Win32 a caratteri estesi.

Perché non puoi realizzare la stessa cosa con char :

Il minimo assoluto Ogni sviluppatore di software deve assolutamente conoscere l’Unicode e i set di caratteri (nessuna scusa!)

Fai attenzione, wchar_t è spesso 16 bit che non è sufficiente per memorizzare tutti i caratteri unicode ed è una ctriggers scelta di dati in UTF_8 per esempio

char è generalmente un singolo byte. ( sizeof(char) deve essere uguale a 1).

wchar_t stato aggiunto alla lingua specificatamente per supporre caratteri multibyte.