Quelle version d’Unicode est prise en charge par quelle plate-forme .NET et sur quelle version de Windows en ce qui concerne les classes de caractères?

Question mise à jour ¹

En ce qui concerne les classes de caractères, la comparaison, le sorting, la normalisation et les classements, quelles versions Unicode sont sockets en charge par quelles plates-formes .NET?

Question originale

Je me souviens un peu vaguement d’avoir lu que .NET prenait en charge la version Unicode 3.0 et que le codage UTF-16 interne n’était pas vraiment UTF-16 mais utilisait en réalité UCS-2, ce qui n’est pas le même. Il semble, par exemple, que les caractères supérieurs à U + FFFF ne soient pas possibles, c’est-à-dire considérons:

ssortingng s = "\u1D7D9"; // ("Mathematical double-struck digit one") 

et il stocke la chaîne "ᵽ9" .

Je cherche essentiellement des références définitives de réponses aux questions suivantes:

  • Si ce n’est pas vrai UTF-16 dans .NET, de quoi s’agit-il?
  • Quelle version d’Unicode est supscope par .NET?
  • Si les versions récentes ne sont pas sockets en charge ou planifiées dans un proche avenir, quelqu’un connaît-il une bibliothèque (non) commerciale ou comment puis-je résoudre ce problème?

¹) J’ai mis à jour la question au fur et à mesure que le temps passait, cela me semble plus approprié en ce qui concerne les réponses et la communauté au sens large. J’ai laissé la question initiale à la place de quelles parties ont été répondues dans les commentaires. L’ancien UCS-2 (sans substitut) était également utilisé dans les versions désormais anciennes de Windows 32 bits. NET a toujours utilisé UTF-16 (avec des substituts) en interne.

En interne, .NET est UTF-16. Dans certains cas, par exemple, lorsque ASP.NET écrit dans une réponse, il utilise par défaut UTF-8. Les deux peuvent gérer des avions plus élevés.

La raison pour laquelle les gens appellent parfois .NET UCS2 est (je pense , parce que je ne vois que peu d’autres raisons) que Char est ssortingctement 16 bits et qu’un seul caractère ne peut pas être utilisé pour représenter les plans supérieurs. Cependant, Char a des surcharges de méthodes statiques (par exemple Char.IsLetter ) qui peuvent fonctionner sur des caractères UTF-16 dans le plan supérieur dans une chaîne. Les chaînes sont stockées en tant que vrai UTF-16.

Vous pouvez adresser directement les points de code Unicode élevés en utilisant des majuscules \U – par exemple, "\U0001D7D9" – mais encore une fois, uniquement à l’intérieur des chaînes, pas des caractères.

En ce qui concerne la version Unicode, à partir de la documentation MSDN :

“Dans le .NET Framework 4, les informations de sorting, de casse, de normalisation et de caractères Unicode sont synchronisées avec Windows 7 et sont conformes à la norme Unicode 5.1 .”

Mise à jour 1: Il convient toutefois de noter que cela ne signifie pas que l’intégralité d’Unicode 5.1 est prise en charge, ni dans Windows 7 ni dans .NET 4.0.

Cibles Windows 8 Unicode 6.0 – Je suppose que .NET Framework 4.5 pourrait se synchroniser avec cela, mais qu’aucune source n’a pu le confirmer. Et encore une fois, cela ne signifie pas que toute la norme est mise en œuvre.

Mise à jour 2: Cette note sur Roslyn confirme que la plate-forme sous-jacente définit le support Unicode pour le compilateur et explique dans le lien vers le code que C # 6.0 prend en charge Unicode 6.0 et versions ultérieures (avec un changement radical pour les identificateurs C #).

Mise à jour 3: Depuis la version 4.5 de .NET, une nouvelle classe, SortVersion été introduite pour obtenir la version Unicode prise en charge en appelant la propriété statique SortVersion.FullVersion . Sur la même page , Microsoft explique que .NET 4.0 prend en charge Unicode 5.0 sur toutes les plates-formes et que .NET 4.5 prend en charge Unicode 5.0 sur Windows 7 et Unicode 6.0 sur Windows 8. Cela contraste légèrement avec la déclaration officielle “quoi de neuf” ici , qui parle de version 5.x et 6.0 respectivement. D’après ma propre expérience (éditeur: Abel), dans la plupart des cas, il semble que, dans .NET 4.0, Unicode 5.1 soit au moins pris en charge pour les classes de caractères, mais je n’ai pas testé le sorting, la normalisation et les classements. Cela semble correspondre à ce qui est dit dans MSDN , cité ci-dessus.

Ce personnage est supporté. Une chose à noter est que pour les caractères unicode de plus de 2 octets, vous devez les déclarer avec une majuscule ‘\ U’, comme ceci:

ssortingng text = "\U0001D7D9"

Si vous créez une application WPF avec ce caractère dans un bloc de texte, le double-un caractère doit être restitué à la perfection.

MSDN le décrit brièvement ici: http://msdn.microsoft.com/en-us/library/9b1s4yhz(v=vs.90).aspx

J’ai essayé ceci:

  static void Main(ssortingng[] args) { ssortingng someText = char.ConvertFromUtf32(0x1D7D9); using (var stream = new MemoryStream()) { using (var writer = new StreamWriter(stream, Encoding.UTF32)) { writer.Write(someText); writer.Flush(); } var bytes = stream.ToArray(); foreach (var oneByte in bytes) { Console.WriteLine(oneByte.ToSsortingng("x")); } } } 

Et obtenu un vidage d’un tableau d’octets contenant une nomenclature correcte et la représentation correcte du sharepoint code \ u1D7D9 , pour ces codages:

  • UTF8
  • UTF32
  • Unicode (UTF-16)

Donc, je suppose que les avions de niveau supérieur sont pris en charge et que UTF-16 est vraiment UTF-16 (et non UCS-2)

.NET Framework 4.6 et 4.5 et 4 et 3.5 et 3.0 – Le standard Unicode, version 5.0 .NET Framework 2.0 et 1.1 – Le standard Unicode, version 3.1

Les réponses complètes se trouvent ici dans la section Remarques.