Domanda

Ho un oggetto stringa

" con più caratteri e persino caratteri speciali "

Sto cercando di usare

UTF8Encoding utf8 = new UTF8Encoding();
ASCIIEncoding ascii = new ASCIIEncoding();

oggetti per convertire quella stringa in ascii. Posso chiedere a qualcuno di portare un po 'di luce a questo semplice compito, che è la caccia al mio pomeriggio.

MODIFICA 1: Quello che stiamo cercando di realizzare è liberarci di personaggi speciali come alcuni degli speciali apostrofi di Windows. Il codice che ho pubblicato di seguito come risposta non se ne occuperà. Fondamentalmente

  

O'Brian diventerà O? Brian. dove "è uno degli apostrofi speciali

È stato utile?

Soluzione

Questo è stato in risposta alla tua altra domanda, sembra che sia stato eliminato .... il punto è ancora valido.

Sembra un classico Unicode to ASCII issue . Il trucco sarebbe trovare dove sta accadendo.

.NET funziona bene con Unicode, supponendo si dice che sia Unicode per cominciare (o lasciato al valore predefinito).

La mia ipotesi è che l'app di ricezione non può gestirla. Quindi, probabilmente userò ASCIIEncoder con an EncoderReplacementFallback con String.Empty:

using System.Text;

string inputString = GetInput();
var encoder = ASCIIEncoding.GetEncoder();
encoder.Fallback = new EncoderReplacementFallback(string.Empty);

byte[] bAsciiString = encoder.GetBytes(inputString);

// Do something with bytes...
// can write to a file as is
File.WriteAllBytes(FILE_NAME, bAsciiString);
// or turn back into a "clean" string
string cleanString = ASCIIEncoding.GetString(bAsciiString); 
// since the offending bytes have been removed, can use default encoding as well
Assert.AreEqual(cleanString, Default.GetString(bAsciiString));

Ovviamente, ai vecchi tempi, avremmo semplicemente rimosso e rimosso tutti i caratteri maggiore di 127 .. .bene, almeno quelli di noi negli Stati Uniti. ;)

Altri suggerimenti

Sono stato in grado di capirlo. Nel caso qualcuno volesse sapere sotto il codice che ha funzionato per me:

ASCIIEncoding ascii = new ASCIIEncoding();
byte[] byteArray = Encoding.UTF8.GetBytes(sOriginal);
byte[] asciiArray = Encoding.Convert(Encoding.UTF8, Encoding.ASCII, byteArray);
string finalString = ascii.GetString(asciiArray);

Fammi sapere se esiste un modo più semplice di farlo.

Per chiunque ami i metodi di estensione, questo è il trucco per noi.

using System.Text;

namespace System
{
    public static class StringExtension
    {
        private static readonly ASCIIEncoding asciiEncoding = new ASCIIEncoding();

        public static string ToAscii(this string dirty)
        {
            byte[] bytes = asciiEncoding.GetBytes(dirty);
            string clean = asciiEncoding.GetString(bytes);
            return clean;
        }
    }
}

(Spazio dei nomi di sistema, quindi è disponibile praticamente automaticamente per tutte le nostre stringhe.)

Sulla base della risposta di Mark sopra (e del commento di Geo), ho creato una versione a due righe per rimuovere tutti i casi di eccezione ASCII da una stringa. Fornito per le persone che cercano questa risposta (come ho fatto io).

using System.Text;

// Create encoder with a replacing encoder fallback
var encoder = ASCIIEncoding.GetEncoding("us-ascii", 
    new EncoderReplacementFallback(string.Empty), 
    new DecoderExceptionFallback());

string cleanString = encoder.GetString(encoder.GetBytes(dirtyString)); 

Se vuoi una rappresentazione a 8 bit di caratteri usati in molte codifiche, questo potrebbe aiutarti.

Devi cambiare la variabile targetEncoding in qualunque codifica desideri.

Encoding targetEncoding = Encoding.GetEncoding(874); // Your target encoding
Encoding utf8 = Encoding.UTF8;

var stringBytes = utf8.GetBytes(Name);
var stringTargetBytes = Encoding.Convert(utf8, targetEncoding, stringBytes);
var ascii8BitRepresentAsCsString = Encoding.GetEncoding("Latin1").GetString(stringTargetBytes);
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top