2009-03-20 23 views
17

Ad esempio: "½" o ASCII dicembre 189. Quando ho letto il byte da un file di testo il byte [] contiene il valore valido, in questo caso 189.Come posso convertire ascii esteso su System.String?

Conversione ai risultati Unicode nel carattere di sostituzione Unicode 65533

UnicodeEncoding.Unicode.GetString (b);

Conversione in risultati ASCII in 63 o "?"

ASCIIEncoding.ASCII.GetString (b);

Se questo non è possibile qual è il modo migliore per gestire questi dati? Mi piacerebbe essere in grado di eseguire funzioni di stringa come Sostituisci().

risposta

24

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 Codificato UTF-16, quindi è necessario utilizzare un codificatore/decodificatore per convertire qualsiasi altra cosa, a volte questo è predefinito (es. UTF-8 per istanze FileStream), ma è buona norma specificare sempre.

Avrete bisogno di qualche forma di metadata implicita o (meglio) esplicita per fornirvi le informazioni su quale codifica.

+1

Questa roba di codifica mi ha fatto impazzire ... ma la tua risposta ha fatto il trucco per me !!! Mi ci è voluto un po 'per capire cosa cercare, ma alla fine ho capito quali dovrebbero essere i termini di ricerca corretti. :) Grazie per avermi fornito una soluzione semplice al mio problema. :) – Dave

10

Dipende esattamente da cosa è la codifica.

Non c'è niente come "ASCII 189" - ASCII va solo fino a 127. Ci sono molte codifiche che codifiche a 8 bit usano ASCII per i primi 128 valori.

Encoding.Default (che è la codifica predefinita per il proprio sistema particolare), ma è difficile sapere con certezza. Da dove vengono i tuoi dati?

+0

Quello che sto leggendo nel byte [] allinea con 188 - 190 in questo esteso grafico ascii: http://charlie.balch.org/asp/ascii.asp. Encoding.Default ha funzionato.Grazie mille! – rtremaine

+1

Contento che abbia funzionato - sii consapevole che chiunque parli di "ASCII esteso" come se ciò significasse una particolare codifica non sa di cosa sta parlando. È come parlare di "un dollaro": un dollaro USA, dollaro australiano, dollaro canadese, cosa? Può avere senso in un particolare contesto –

+0

ma non è un'idea definitiva e unica. Quindi oserei dire che l'idea di Charlie di "ASCII esteso" è appropriata per * la sua * cultura - ma non corrisponderebbe a ciò che accade sui computer di altre persone. –

12

Il vecchio set di caratteri ASCII PC-8 o Extended era prima che IBM e Microsoft introducessero l'idea di Code Pages nel mondo dei PC. Questo WAS Extended ASCII - nel 1982. In effetti, era l'UNICO set di caratteri disponibile su PC al momento, fino a quando la scheda EGA non ti permetteva di caricare altri font in VRAM.

Questo era anche lo standard predefinito per i terminali ANSI e quasi tutti i BBS che ho composto negli anni '80 e nei primi anni '90 utilizzavano questo set di caratteri per la visualizzazione di menu e caselle.

Ecco il codice per trasformare ASCII esteso a 8 bit in testo Unicode. Nota il bit di codice chiave: GetEncoding ("437"). Questo ha usato il codice Pagina 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); 
    } 
+0

Wow! Grazie! Come nota a margine, la tua risposta è anche un'ottima soluzione per trasformare un array di byte in una stringa e tornare indietro. – mike

1

System.String[] non può caratteri negozi con ASCII > 127 se si sta cercando di lavorare su tutti i caratteri ASCII estesi come œ ¢ ½ ¾here è il metodo per convertire nel loro binario e decimale equivalente

Problemi correlati