Qu’est-ce qu’une “chaîne de caractères large” en langage C?

Je suis tombé sur ceci dans le livre:

wscanf(L"%lf", &variable); 

où le premier paramètre est du type de wchar_t * .

C’est différent de scanf("%lf", &variable); où le premier paramètre est de type char * .

Alors, quelle est la différence que. Je n’ai jamais entendu “chaîne de caractères large” auparavant. J’ai entendu quelque chose appelé Raw Ssortingng Literals, qui imprime la chaîne telle quelle (pas besoin d’éléments tels que des séquences d’échappement), mais ce n’était pas en C.

La nature exacte des caractères larges est définie (volontairement) par implémentation gauche.

Lorsqu’ils ont inventé pour la première fois le concept de wchar_t , ISO 10646 et Unicode étaient toujours en concurrence (alors qu’ils coopèrent pour la plupart). Plutôt que d’essayer de décréter qu’un caractère international serait l’un ou l’autre (ou éventuellement quelque chose d’autre), ils ont simplement fourni un type (et certaines fonctions) que la mise en œuvre pourrait définir pour prendre en charge les jeux de caractères internationaux à leur choix.

Différentes mises en œuvre ont exercé ce potentiel de variation. Par exemple, si vous utilisez le compilateur de Microsoft sous Windows, wchar_t sera un type Unicode 16 bits UTF-16 (à l’origine, il contenait UCS-2 Unicode, mais il est maintenant officiellement obsolète).

Sous Linux, wchar_t sera le plus souvent un type 32 bits contenant des caractères Unicode codés UCS-4 / UTF-32. Les ports de gcc sur au moins certains autres systèmes d’exploitation font la même chose, bien que je n’ai jamais essayé de confirmer que c’était toujours le cas.

Il n’y a cependant aucune garantie de cela. Au moins en théorie, une implémentation sur Linux pourrait utiliser 16 bits, ou une autre sur Windows pourrait utiliser 32 bits, ou bien l’un ou l’autre pourrait décider d’utiliser 64 bits (bien que je serais un peu surpris de voir cela en réalité).

Dans tous les cas, l’idée générale de la façon dont les choses sont censées fonctionner est qu’un seul wchar_t est suffisant pour représenter un sharepoint code. Pour les E / S, les données sont destinées à être converties de la représentation externe (quelle qu’elle soit) en wchar_t s, ce qui (est censé) les rendre relativement faciles à manipuler. Ensuite, lors de la sortie, ils sont à nouveau transformés en encodage de votre choix (qui peut être entièrement différent de celui que vous avez lu).

“Chaîne de caractères large” fait référence à l’encodage des caractères de la chaîne.

De Wikipedia :

Un caractère large est un type de données de caractère d’ordinateur dont la taille est généralement supérieure à celle du caractère traditionnel à 8 bits. L’augmentation de la taille du type de données permet d’utiliser des jeux de caractères codés plus volumineux.

UTF-16 est l’un des codages à caractères larges les plus couramment utilisés.

En outre, wchar_t est défini par Microsoft comme un object de données unsigned short(16-bit) . Cela pourrait être et est probablement une définition différente dans d’autres systèmes d’exploitation ou dans d’autres langues.

Tiré de l’article Wikipedia du commentaire ci-dessous:

“La largeur de wchar_t est spécifique au compilateur et ne doit pas dépasser 8 bits. Par conséquent, les programmes devant être portables dans un compilateur C ou C ++ ne doivent pas utiliser wchar_t pour stocker du texte Unicode. Le type wchar_t est destiné à stocker le compilateur. des caractères larges définis, qui peuvent être des caractères Unicode dans certains compilateurs. ”