Come posso convertire ASCII esteso in System.String?
-
21-08-2019 - |
Domanda
Per esempio:"½" o ASCII DEC 189.Quando leggo i byte da un file di testo, byte[] contiene il valore valido, in questo caso 189.
La conversione in Unicode genera il carattere sostitutivo Unicode 65533.
UnicodeEncoding.Unicode.GetString(b);
La conversione in ASCII restituisce 63 o "?"
ASCIIEncoding.ASCII.GetString(b);
Se ciò non è possibile, qual è il modo migliore per gestire questi dati?Mi piacerebbe essere in grado di eseguire funzioni di stringa come Sostituisci().
Soluzione
Byte 189 rappresenta un "½" in iso-8859-1 (alias "Latin-1"), in modo che segue è forse ciò che si vuole:
var e = Encoding.GetEncoding("iso-8859-1");
var s = e.GetString(new byte[] { 189 });
Tutte le stringhe e caratteri in .NET sono UTF-16 codificato, quindi è necessario utilizzare un codificatore / decodificatore per convertire qualsiasi altra cosa, a volte questo è default (ad esempio UTF-8 per le istanze FileStream) ma buona pratica è quella di indicare sempre .
Avrete bisogno di una qualche forma di implicita o (meglio) metadati esplicita a fornirvi le informazioni su quale codifica.
Altri suggerimenti
Dipende esattamente ciò che la codifica è.
Non c'è cosa come "ASCII 189" - ASCII va solo fino a 127. Ci sono molte codifiche che un 8 bit codifiche utilizzano ASCII per i primi 128 valori
. possono vogliono Encoding.Default
(che è la codifica di default per il sistema particolare), ma è difficile sapere con certezza. Da dove i dati vengono?
Il vecchio set di caratteri PC-8 o ASCII esteso esisteva prima che IBM e Microsoft introducessero l'idea delle Code Page nel mondo dei PC.Questo ERA ASCII esteso - nel 1982.In effetti, all'epoca era l'UNICO set di caratteri disponibile sui PC, fino a quando la scheda EGA non consentiva di caricare altri caratteri nella VRAM.
Questo era anche lo standard predefinito per i terminali ANSI e quasi tutte le BBS a cui mi collegavo negli anni '80 e all'inizio degli anni '90 utilizzavano questo set di caratteri per visualizzare menu e caselle.
Ecco il codice per trasformare l'ASCII esteso a 8 bit in testo Unicode.Nota la parte chiave del codice:GetEncoding("437").Utilizzava la Code Page 437 per tradurre il testo ASCII a 8 bit nell'equivalente Unicode.
string ASCII8ToString(byte[] ASCIIData)
{
var e = Encoding.GetEncoding("437");
return e.GetString(ASCIIData);
}
System.String[]
non può memorizzare i caratteri con ASCII > 127
se si sta cercando di lavorare su tutti i caratteri ASCII estesi, come œ ¢ ½ ¾
qui è il metodo per convertire nel loro binario e equivalente decimale