Por que Encoding.Default não deve ser usado ...
A resposta de @ Randall é usada Encoding.Default
, no entanto, a Microsoft lança um aviso contra :
Computadores diferentes podem usar codificações diferentes como padrão e a codificação padrão pode ser alterada em um único computador. Se você usar a codificação padrão para codificar e decodificar dados transmitidos entre computadores ou recuperados em momentos diferentes no mesmo computador, isso poderá traduzir esses dados incorretamente. Além disso, a codificação retornada pela propriedade Padrão usa o fallback de melhor ajuste para mapear caracteres não suportados para caracteres suportados pela página de código. Por esses motivos, o uso da codificação padrão não é recomendado. Para garantir que os bytes codificados sejam decodificados corretamente, você deve usar uma codificação Unicode, como UTF8Encoding ou UnicodeEncoding. Você também pode usar um protocolo de nível superior para garantir que o mesmo formato seja usado para codificação e decodificação.
Para verificar qual é a codificação padrão, use Encoding.Default.WindowsCodePage
(1250 no meu caso - e, infelizmente, não há classe predefinida de codificação CP1250, mas o objeto pode ser recuperado comoEncoding.GetEncoding(1250)
).
Encoding.ASCII
é 7bit, então também não funciona, no meu caso:
byte[] pass = Encoding.ASCII.GetBytes("šarže");
Console.WriteLine(Encoding.ASCII.GetString(pass)); // ?ar?e
... e por que a codificação UTF-8 deve ser usada ...
A codificação padrão é enganosa: o .NET usa UTF-8 em todos os lugares como o padrão real (codificações de 8 bits se tornaram obsoletas no final do século 20. verifique Console.OutputEncoding.EncodingName
*) para que todas as constantes definidas no código sejam codificadas em UTF-8 por padrão - portanto este deve ser usado, a menos que a fonte de dados esteja em codificação diferente.
* Este é UTF-8 no meu caso, o que é uma mentira direta: chcp
do console do Windows (cmd) retorna 852 - e isso não deve ser alterado, porque os comandos do sistema localizado (como ping) possuem essa página de código codificada
Seguindo a recomendação da Microsoft:
var utf8 = new UTF8Encoding();
byte[] pass = utf8.GetBytes("šarže");
Console.WriteLine(utf8.GetString(pass)); // šarže
Encoding.UTF8
recomendado por outras pessoas é uma instância de codificação UTF-8 e também pode ser usado diretamente ou como
var utf8 = Encoding.UTF8 as UTF8Encoding;
... mas nem sempre é usado
A codificação para matrizes de bytes deve "apenas funcionar" em Unicode nos países ocidentais, mas assim que você move o programa para algumas regiões com menos suporte (como aqui na Europa Oriental), é uma verdadeira bagunça: na República Tcheca, os padrões do Windows usam (em 2020!) MS não-padrão 852 (também conhecido como Latin-2) para console, 1250 como Windows OEM, UTF-8 (65001) como .NET (e outros) novo padrão e devemos ter em mente que alguns países de 8 bits da UE ocidental os dados ainda estão em 1252, enquanto o antigo padrão ocidental de 8 bits da Europa Oriental era ISO-8859-2 (também conhecido como Latin-2, mas NÃO o mesmo Latin-2 que 852). Usar ASCII significa texto cheio de tofu e '?' aqui. Portanto, até a metade do século XXI, defina UTF-8 explicitamente .
searchResult.Properties["user"][0]
? Tentebyte[]