Je me demande simplement pourquoi nous avons char
type de 2 octets en C # (.NET) contrairement à 1 octet dans d'autres langages de programmation?
Un caractère est unicode en C #, donc le nombre de caractères possibles dépasse 255. Vous aurez donc besoin de deux octets.
Extended ASCII par exemple, a un ensemble de 255 caractères, et peut donc être stocké dans un seul octet. C'est aussi tout l'objet du System.Encoding
espace de noms, car différents systèmes peuvent avoir des jeux de caractères et des tailles de caractères différents. C # peut donc gérer un/quatre/etc. octets de caractères, mais Unicode UTF-16 est par défaut.
Je suppose qu'avec "autres langages de programmation" vous voulez dire que C. C a en fait deux types de char
: char
et wchar_t
. char
peut faire un octet de long, wchar_t
pas nécessairement.
En C # (et .NET) d'ailleurs, toutes les chaînes de caractères sont encodées en Unicode en UTF-16. C'est pourquoi un char
dans .NET représente un seul UTF-16 nité de code qui peut être un point de code ou la moitié d'une paire de substitution (pas réellement un alors).
En fait, C #, ou plus précisément le CLR, la taille du caractère est compatible avec la plupart des autres langages gérés. Les langages gérés, comme Java, ont tendance à être plus récents et à intégrer des éléments tels que la prise en charge unicode. L'extension naturelle de la prise en charge des chaînes unicode est d'avoir des caractères unicode.
Les langages plus anciens comme C/C++ ont commencé en ASCII uniquement et seulement plus tard, le support unicode a été ajouté.
Parce qu'un caractère dans une chaîne C # par défaut est le codage UTF-16 de Unicode, qui est de 2 octets (par défaut).
C # utilisant une largeur de caractère de 16 bits a probablement plus à voir avec les performances plutôt qu'avec autre chose.
Premièrement, si vous utilisez UTF-8, vous pouvez adapter chaque personnage dans la "bonne" quantité d'espace. En effet, UTF-8 est de largeur variable. ASCII utiliseront 8 bits tandis que les caractères plus gros en utiliseront plus.
Mais le codage de caractères de longueur variable encourage la complexité d'un algorithme O (n) dans les scénarios courants. Par exemple. Récupération d'un caractère à un emplacement particulier dans une chaîne. Il y a eu des discussions publiques sur ce point. Mais la solution la plus simple est de continuer à utiliser une largeur de caractère qui convient à la plupart de votre jeu de caractères, en tronquant les autres. Vous avez maintenant une largeur de caractère fixe.
À strictement parler, UTF-16 est également un codage à largeur variable, donc C # (et Java d'ailleurs) utilisent quelque chose d'hybride puisque leurs largeurs de caractères ne sont jamais de 32 bits.
Parce que les chaînes en .NET sont codées en caractères Unicode de 2 octets.