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().

È stato utile?

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top