Perché Encoding.Default non dovrebbe essere usato ...
La risposta di @ Randall utilizza Encoding.Default
, tuttavia Microsoft genera un avvertimento :
Computer diversi possono utilizzare codifiche diverse come impostazione predefinita e la codifica predefinita può cambiare su un singolo computer. Se si utilizza la codifica predefinita per codificare e decodificare i dati trasmessi in streaming tra computer o recuperati in momenti diversi sullo stesso computer, è possibile che i dati vengano tradotti in modo errato. Inoltre, la codifica restituita dalla proprietà Default utilizza il fallback più adatto per mappare i caratteri non supportati ai caratteri supportati dalla tabella codici. Per questi motivi, si consiglia di non utilizzare la codifica predefinita. Per garantire che i byte codificati siano decodificati correttamente, è necessario utilizzare una codifica Unicode, come UTF8Encoding o UnicodeEncoding. È inoltre possibile utilizzare un protocollo di livello superiore per garantire che lo stesso formato venga utilizzato per la codifica e la decodifica.
Per verificare quale sia la codifica predefinita, utilizzare Encoding.Default.WindowsCodePage
(1250 nel mio caso - e purtroppo non esiste una classe predefinita di codifica CP1250, ma l'oggetto può essere recuperato come Encoding.GetEncoding(1250)
).
Encoding.ASCII
è 7 bit, quindi non funziona neanche, nel mio caso:
byte[] pass = Encoding.ASCII.GetBytes("šarže");
Console.WriteLine(Encoding.ASCII.GetString(pass)); // ?ar?e
... e perché usare invece la codifica UTF-8 ...
La codifica predefinita è fuorviante: .NET utilizza UTF-8 ovunque come il vero valore predefinito (le codifiche a 8 bit sono diventate obsolete alla fine del 20. secolo, controlla cioè Console.OutputEncoding.EncodingName
*), quindi ogni costante definita nel codice è codificata UTF-8 per impostazione predefinita, quindi questo dovrebbe essere usato a meno che l'origine dati non abbia una codifica diversa.
* Questo è UTF-8 nel mio caso che è una bugia diretta: chcp
dalla console di Windows (cmd) restituisce 852 - e questo non dovrebbe essere cambiato, perché i comandi di sistema localizzati (come ping) hanno questa codepage codificata
Seguendo le raccomandazioni di Microsoft:
var utf8 = new UTF8Encoding();
byte[] pass = utf8.GetBytes("šarže");
Console.WriteLine(utf8.GetString(pass)); // šarže
Encoding.UTF8
raccomandato da altri è un'istanza di codifica UTF-8 e può essere utilizzato anche direttamente o come
var utf8 = Encoding.UTF8 as UTF8Encoding;
... ma non è sempre usato
La codifica per array di byte dovrebbe "funzionare" in Unicode nei paesi occidentali, ma non appena si sposta il programma in alcune regioni meno supportate (come qui nell'Europa orientale), è un vero casino: nella Repubblica Ceca le impostazioni predefinite di Windows utilizzano (nel 2020!) MS non standard 852 (aka Latin-2) per console, 1250 come OEM Windows, UTF-8 (65001) come .NET (e altri) nuovo predefinito e dovremmo tenere presente che alcuni 8bit UE occidentali i dati sono ancora nel 1252, mentre il vecchio standard occidentale a 8 bit per l'Europa orientale era ISO-8859-2 (aka Latin-2, ma NON lo stesso Latin-2 dell'852). L'uso di ASCII significa testo pieno di tofu e '?' Qui. Quindi, fino alla metà del 21 ° secolo, impostare UTF-8 in modo esplicito .
searchResult.Properties["user"][0]
? Prova a lanciarlo perbyte[]
primo