Frage

Ich habe ein String-Objekt

„mit mehreren Zeichen und sogar Sonderzeichen“

Ich versuche zu verwenden,

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

Objekte, um diese Zeichenfolge zu ascii zu konvertieren. Darf ich jemanden fragen, etwas Licht auf diese einfache Aufgabe zu bringen, dass mein Nachmittag ist die Jagd.

EDIT 1: Was wir versuchen, wie einige der speziellen Fenster Apostrophe lose Sonderzeichen zu erreichen, ist immer. Der Code, den ich unten als Antwort gepostet wird nicht kümmern, dass. Grundsätzlich

  

O'Brian wird geworden O? Brian. wo 'ist eine der besonderen Apostrophe

War es hilfreich?

Lösung

Dies als Antwort auf Ihre andere Frage war, die wie folgt aussieht es gelöscht .... der Punkt noch steht.

Sieht aus wie ein klassischen Unicode in ASCII-Ausgabe . Der Trick wäre zu finden mit es passiert.

.NET arbeitet mit Unicode in Ordnung, es gesagt ist es Unicode ist zu beginnen (oder auf dem Standard links).

Mein erraten ist, dass Ihr Empfang App nicht damit umgehen kann. Also, würde ich wahrscheinlich die Verwendung ASCIIEncoder mit eines Encoder mit 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));

Natürlich in den alten Tagen, würden wir nur Schleife wenn und falls vorhanden entfernen Zeichen größer als 127 .. .nun, zumindest diejenigen von uns in den USA. ;)

Andere Tipps

Ich war in der Lage, es herauszufinden. Falls jemand will unter dem Code wissen, die für mich gearbeitet:

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

Lassen Sie mich wissen, ob es einen einfacheren Weg ist es o tun.

Für alle, die Erweiterungsmethoden mag, dieser funktioniert der Trick für uns.

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;
        }
    }
}

(System-Namespace, so ist es für alle unsere Saiten ziemlich automatisch zur Verfügung.)

Basierend auf Mark Antwort oben (und Geo Kommentar), Ich habe eine zwei Liner-Version alle ASCII Ausnahme Fälle aus einer Zeichenfolge zu entfernen. Vorausgesetzt, für Leute für diese Antwort suchen (wie ich).

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)); 

Wenn Sie 8-Bit-Darstellung von Zeichen, die in vieler Codierung verwendet, das Ihnen helfen kann.

Sie müssen Variablen ändern targetEncoding , was auch immer Codierung Sie wollen.

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);
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top