Pergunta

Eu tenho um objeto string

"com vários personagens e até mesmo caracteres especiais"

Eu estou tentando usar

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

objetos, a fim de converter essa string para ascii. Posso pedir a alguém para trazer um pouco de luz para esta tarefa simples, que é a caça minha tarde.

EDIT 1: O que estamos tentando fazer é se livrar de caracteres especiais como alguns dos apóstrofos janelas especiais. O código que eu postei abaixo como uma resposta não vai cuidar disso. Basicamente

O'Brian se tornará O? Brian. onde 'é um dos apóstrofos especiais

Foi útil?

Solução

Isso foi em resposta à sua outra pergunta, que se parece com ele foi eliminado .... o ponto ainda está de pé.

Parece um clássico Unicode a questão ASCII . O truque seria encontrar , onde que está acontecendo.

.NET fina trabalha com Unicode, assumindo é dito que o Unicode para começar (ou à esquerda no padrão).

Meu acho é que seu aplicativo de recepção não pode lidar com isso. Então, eu provavelmente iria usar o ASCIIEncoder com um EncoderReplacementFallback com 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));

É claro que, nos velhos tempos, tínhamos acabado de loop embora e remover qualquer caracteres superior a 127 .. .bem, aqueles de nós nos EUA, pelo menos. ;)

Outras dicas

Eu era capaz de descobrir isso. No caso de alguém quiser saber abaixo o código que funcionou para mim:

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

Deixe-me saber se existe uma maneira mais simples o fazê-lo.

Para qualquer um que gosta de métodos de extensão, este faz o truque para nós.

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

(namespace System por isso é bastante disponível automaticamente para todas as nossas cordas.)

Com base na resposta de Mark acima (e comentário de Geo), eu criei uma versão dois forro para remover todos os casos de exceção ASCII de uma string. Fornecidas para as pessoas à procura de esta resposta (como eu fiz).

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 você quiser 8 representação bit de caracteres que usado em muitos codificação, isso pode ajudá-lo.

Você deve alterar variável targetEncoding para qualquer codificação que você deseja.

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);
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top