Hoe om te zetten (transliterate) een string van utf8 naar ASCII (één byte) in c#?

Ik heb een string-object

“met meerdere personages en zelfs speciale tekens”

Ik probeer gebruik te maken

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

objecten om te zetten die string ascii. Kan ik iemand vragen om wat licht op deze eenvoudige taak, dat is de jacht van mijn middag.

BEWERKEN 1:
Wat we proberen te bereiken is het wegwerken van speciale tekens, zoals een aantal van de speciale windows apostroffen. De code die ik hieronder geplaatst als een antwoord zal niet zorgen. In principe

O ‘ Brien zal worden O?Brian. waar ‘ is één van de speciale apostrofs

  • Merk op dat als u wilt vervangen door tekens met accenten met hun unaccented middelen, kunt u gebruik maken van str.Normaliseren(NormalizationForm.FormKD)
InformationsquelleAutor Geo | 2009-01-31



5 Replies
  1. 20

    Dit was in antwoord op je andere vraag, die eruit ziet als het is verwijderd….de punt staat nog steeds.

    Ziet eruit als een klassieke Unicode-ASCII-probleem. De truc zou zijn te vinden waar het gebeurt.

    .NETTO werkt prima met Unicode, uitgaande van het is toch ook Unicode om te beginnen met (of links op de standaard).

    Mijn denk dat is dat uw ontvangst app niet meer aankan. Dus, ik zou waarschijnlijk gebruik maken van de ASCIIEncoder met een EncoderReplacementFallback met een touwtje.Leeg:

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

    Natuurlijk, in de oude dagen, zouden we gewoon doorlopen en verwijder alle tekens meer dan 127…nou, die van ons in de vs tenminste. 😉

    • Dankzij het werkte perfect. Ik had net een kleine verandering. Codering encoder = ASCIIEncoding.GetEncoding(“us-ascii”, nieuwe EncoderReplacementFallback(string.Lege), nieuwe DecoderExceptionFallback());
    • +1 voor EncoderReplacementFallback – ik had nog nooit gehoord had. Liefde.
    • EncoderReplacementFallback met een vraagteken is de standaardinstelling. In dit geval lijkt het een “beter met verlies” is wenselijk. Een uitzondering fallback is handig als lossy is onhoudbaar (die IMHO moet de standaard waarde).
  2. 12

    Ik was in staat om het te achterhalen. In het geval dat iemand wil weten hieronder de code die werkte voor mij:

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

    Laat het me weten als er op een eenvoudige manier o doen.

    • Het is vermeldenswaard dat wanneer de tekenreeks bevat tekens die niet kunnen worden weergegeven in ASCII, het zal niet dezelfde snaar na de conversie. Het ontbreken van die tekens of het kan worden vervormd, afhankelijk van de Codering.Zetten werkt (welke weet ik niet).
    • Eigenlijk heb ik net getest enkele scenario ‘ s en wat je zegt is waar. Weet u hoe u om deze beperking te ondervangen. Bijvoorbeeld als ik een van de speciale aanhalingstekens te vervangen door de gangbare.
  3. 7

    Voor iedereen die houdt van Extension methods, deze doet de truc voor ons.

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

    (Systeem-naamruimte, zodat het beschikbaar vrijwel automatisch voor al onze snaren.)

  4. 5

    Gebaseerd op Mark ’s antwoord hierboven (en Geo’ s reactie), ik heb een twee liner versie om te verwijderen alle ASCII-uitzondering gevallen van een string. Beschikbaar voor mensen op zoek naar dit antwoord (zoals ik deed).

    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)); 
  5. 1

    Als u wilt, 8 bit representatie van tekens die worden gebruikt in vele codering, kan dit u helpen.

    Moet u de variabele targetEncoding aan welke codering je wilt.

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

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *