Pourquoi Encoding.Default ne doit pas être utilisé ...
@ Randall's answer uses Encoding.Default
, cependant Microsoft lève un avertissement contre cela :
Différents ordinateurs peuvent utiliser différents encodages par défaut et l'encodage par défaut peut changer sur un seul ordinateur. Si vous utilisez le codage par défaut pour coder et décoder les données transmises en continu entre ordinateurs ou récupérées à différents moments sur le même ordinateur, il se peut qu'elles traduisent incorrectement ces données. En outre, le codage renvoyé par la propriété Default utilise la solution de secours la mieux adaptée pour mapper les caractères non pris en charge aux caractères pris en charge par la page de codes. Pour ces raisons, l'utilisation de l'encodage par défaut n'est pas recommandée. Pour vous assurer que les octets codés sont décodés correctement, vous devez utiliser un codage Unicode, tel que UTF8Encoding ou UnicodeEncoding. Vous pouvez également utiliser un protocole de niveau supérieur pour vous assurer que le même format est utilisé pour l'encodage et le décodage.
Pour vérifier quel est l'encodage par défaut, utilisez Encoding.Default.WindowsCodePage
(1250 dans mon cas - et malheureusement, il n'y a pas de classe prédéfinie d'encodage CP1250, mais l'objet peut être récupéré commeEncoding.GetEncoding(1250)
).
Encoding.ASCII
est 7 bits, donc ça ne marche pas non plus, dans mon cas:
byte[] pass = Encoding.ASCII.GetBytes("šarže");
Console.WriteLine(Encoding.ASCII.GetString(pass)); // ?ar?e
... et pourquoi le codage UTF-8 devrait être utilisé à la place ...
L'encodage par défaut est trompeur: .NET utilise UTF-8 partout comme le véritable défaut (les encodages 8 bits sont devenus obsolètes à la fin du 20ème siècle, vérifiez par ex. Console.OutputEncoding.EncodingName
*), donc chaque constante que vous définissez dans le code est UTF-8 encodée par défaut - donc celui-ci doit être utilisé sauf si la source de données est dans un codage différent.
* C'est UTF-8 dans mon cas qui est un mensonge direct: chcp
partir de la console Windows (cmd) renvoie 852 - et cela ne doit pas être modifié, car les commandes système localisées (comme ping) ont cette page de code codée en dur
Suivant la recommandation de Microsoft:
var utf8 = new UTF8Encoding();
byte[] pass = utf8.GetBytes("šarže");
Console.WriteLine(utf8.GetString(pass)); // šarže
Encoding.UTF8
recommandé par d'autres est une instance de l'encodage UTF-8 et peut également être utilisé directement ou
var utf8 = Encoding.UTF8 as UTF8Encoding;
... mais il n'est pas toujours utilisé
L'encodage des tableaux d'octets devrait "fonctionner" dans Unicode dans les pays occidentaux, mais dès que vous déplacez votre programme vers certaines régions moins prises en charge (comme ici en Europe de l'Est), c'est un vrai bordel: en République tchèque, Windows utilise par défaut Windows (en 2020!) MS non standard 852 (alias Latin-2) pour console, 1250 en tant qu'OEM Windows, UTF-8 (65001) en tant que .NET (et autres) nouveau par défaut et nous devons garder à l'esprit que certains pays occidentaux de l'UE 8 bits les données sont toujours en 1252, alors que l'ancienne norme occidentale 8 bits pour l'Europe de l'Est était ISO-8859-2 (alias Latin-2, mais PAS le même Latin-2 que 852). L'utilisation de l'ASCII signifie du texte plein de tofu et «?» ici. Donc, jusqu'à la moitié du 21e siècle, veuillez définir explicitement UTF-8 .
searchResult.Properties["user"][0]
? Essayez de le lancer enbyte[]
premier