¿Por qué no se debe usar Encoding.Default?
La respuesta de @ Randall utiliza Encoding.Default
, sin embargo, Microsoft hace una advertencia en su contra :
Diferentes computadoras pueden usar diferentes codificaciones como predeterminadas, y la codificación predeterminada puede cambiar en una sola computadora. Si utiliza la codificación predeterminada para codificar y decodificar datos transmitidos entre computadoras o recuperados en diferentes momentos en la misma computadora, puede traducir esos datos incorrectamente. Además, la codificación devuelta por la propiedad Predeterminada utiliza el mejor respaldo para asignar caracteres no admitidos a caracteres admitidos por la página de códigos. Por estos motivos, no se recomienda utilizar la codificación predeterminada. Para garantizar que los bytes codificados se decodifiquen correctamente, debe usar una codificación Unicode, como UTF8Encoding o UnicodeEncoding. También puede usar un protocolo de nivel superior para garantizar que se use el mismo formato para codificar y decodificar.
Para verificar cuál es la codificación predeterminada, use Encoding.Default.WindowsCodePage
(1250 en mi caso, y lamentablemente, no hay una clase predefinida de codificación CP1250, pero el objeto podría recuperarse como Encoding.GetEncoding(1250)
).
Encoding.ASCII
es de 7 bits, por lo que tampoco funciona, en mi caso:
byte[] pass = Encoding.ASCII.GetBytes("šarže");
Console.WriteLine(Encoding.ASCII.GetString(pass)); // ?ar?e
... y por qué la codificación UTF-8 debería usarse en su lugar ...
La codificación predeterminada es engañosa: .NET utiliza UTF-8 en todas partes como el valor predeterminado real (las codificaciones de 8 bits se volvieron obsoletas a finales de 20. siglo, marque ie Console.OutputEncoding.EncodingName
*) por lo que cada constante que defina en el código está codificada de forma predeterminada UTF-8, por lo que este debe usarse a menos que la fuente de datos tenga una codificación diferente.
* Este es UTF-8 en mi caso, lo cual es una mentira directa: chcp
desde la consola de Windows (cmd) devuelve 852, y esto no debe cambiarse, porque los comandos del sistema localizados (como ping) tienen esta página de códigos codificada
Siguiendo la recomendación de Microsoft:
var utf8 = new UTF8Encoding();
byte[] pass = utf8.GetBytes("šarže");
Console.WriteLine(utf8.GetString(pass)); // šarže
Encoding.UTF8
recomendado por otros es una instancia de codificación UTF-8 y también se puede usar directamente o como
var utf8 = Encoding.UTF8 as UTF8Encoding;
... pero no se usa siempre
La codificación de los conjuntos de bytes debería "funcionar" en Unicode en los países occidentales, pero tan pronto como mueva su programa a algunas regiones menos compatibles (como aquí en Europa del Este), es un verdadero desastre: en la República Checa, el uso predeterminado de Windows (¡en 2020!) MS no estándar 852 (también conocido como Latin-2) para consola, 1250 como OEM de Windows, UTF-8 (65001) como .NET (y otros) nuevo valor predeterminado y debemos tener en cuenta que algunos 8 bits de la UE occidental los datos todavía están en 1252, mientras que el antiguo estándar occidental de 8 bits para Europa del Este era ISO-8859-2 (también conocido como Latin-2, pero NO el mismo Latin-2 que 852). Usar ASCII significa texto lleno de tofu y '?' aquí. Entonces, hasta la mitad del siglo XXI, configure UTF-8 explícitamente .
searchResult.Properties["user"][0]
? Intentabyte[]