En C# String/Encodage des Caractères quelle est la différence entre GetBytes(), GetString() et la fonction Convert()?
Nous rencontrez des difficultés à obtenir une chaîne Unicode pour convertir une chaîne UTF-8 à envoyer sur le fil:
//Start with our unicode string.
string unicode = "Convert: \u10A0";
//Get an array of bytes representing the unicode string, two for each character.
byte[] source = Encoding.Unicode.GetBytes(unicode);
//Convert the Unicode bytes to UTF-8 representation.
byte[] converted = Encoding.Convert(Encoding.Unicode, Encoding.UTF8, source);
//Now that we have converted the bytes, save them to a new string.
string utf8 = Encoding.UTF8.GetString(converted);
//Send the converted string using a Microsoft function.
MicrosoftFunc(utf8);
Bien que nous avons converti la chaîne en UTF-8, c'est de ne pas arriver en UTF-8.
OriginalL'auteur |
Vous devez vous connecter pour publier un commentaire.
Après une très troublé et confus matin, nous avons trouvé la réponse à ce problème.
Le point clé qui nous manquait, ce qui était de faire de ce très déroutant, était que les types de chaînes sont toujours codés en 16 bits (2 octets) Unicode. Cela signifie que lorsque nous faisons un GetString() sur les octets, ils sont automatiquement ré-encodé en Unicode derrière les coulisses et nous ne sommes pas mieux lotis que nous étions dans la première place.
Quand nous avons commencé à obtenir des erreurs de caractères, et double octet de données à l'autre extrémité, nous savions que quelque chose n'allait pas, mais d'un coup d'oeil au code, nous avons eu, nous ne pouvions pas voir quelque chose de mal. Après l'apprentissage, ce que nous avons expliqué ci-dessus, nous avons réalisé que nous avions besoin d'envoyer le tableau d'octets si nous avons voulu préserver l'encodage. Heureusement, MicrosoftFunc() avait une surcharge qui a été en mesure de prendre un tableau d'octets au lieu d'une chaîne. Cela signifiait que l'on pouvait transformer la chaîne unicode à un codage de nos choix et ensuite l'envoyer exactement comme nous le prévoyons. Le code a changé:
Résumé:
Donc, en conclusion, à partir de ce qui précède, nous pouvons voir que:
Encoding.Unicode
est sévèrement mal nommée, puisqu'elle met en œuvre little-endian l'encodage UTF-16. Il doit vraiment avoir été appeléEncoding.UTF16LE
. Les chaînes sont des séquences de caractères, et en ce que le codage ils sont stockés comme dans la plateforme sous-jacente n'est pas pertinent. C'est un détail d'implémentation qui ils sont stockés en tant que UTF-16.Il n'y a rien de mal à l'appeler
Encoding.Unicode
, à un certain niveau Unicode est un encodage. Le fait qu'une plate-forme choisit d'utiliser l'UTF-16 ou UTF-8, n'est qu'un détail d'implémentation. Lorsque vous utilisez la chaîne, il n'importe pas vraiment ce que le codage il a en interne. Tant que la plate-forme fournit une méthode pour encoder en un, vous n'avez pas nécessairement besoin de savoir ce que le codage interne est tout. Certains langages, python, par exemple, ne dit pas tout de l'encodage à tous dans l'API, ils ont juste l'appeler "une chaîne" et de l'encodage et de décodage, c'est encore plus " propre approche.OriginalL'auteur