Как преобразовать (транслитерировать) строку из utf8 в ASCII (один байт) в c #? - PullRequest
11 голосов
/ 31 января 2009

У меня есть строковый объект

"с несколькими и даже специальными символами"

Я пытаюсь использовать

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

объектов для преобразования этой строки в ascii. Позвольте мне попросить кого-нибудь пролить свет на эту простую задачу, которая заключается в охоте на мой день.

РЕДАКТИРОВАТЬ 1: То, что мы пытаемся сделать, это избавиться от специальных символов, таких как некоторые из специальных апострофов окон. Код, который я разместил ниже как ответ, не позаботится об этом. В основном

О'Брайан станет О'Брайаном. где '- один из особых апострофов

Ответы [ 5 ]

20 голосов
/ 31 января 2009

Это было в ответ на ваш другой вопрос, похоже, что он был удален .... точка все еще остается в силе.

Похоже на классическую версию Unicode для ASCII . Хитрость заключается в том, чтобы найти , где это происходит.

.NET отлично работает с Unicode, при условии, что сказано, что это Unicode для начала (или оставлено по умолчанию).

My думаю, означает, что ваше принимающее приложение не может справиться с этим. Итак, я бы, вероятно, использовал ASCIIEncoder с и EncoderReplacementFallback с 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));

Конечно, в старые времена мы просто зацикливались и удаляли любые символы больше 127 ... ну, по крайней мере, те из нас, кто в США. ;)

12 голосов
/ 31 января 2009

Я смог понять это. В случае, если кто-то хочет знать ниже код, который работал для меня:

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

Дайте мне знать, если есть более простой способ сделать это.

7 голосов
/ 03 февраля 2012

Для тех, кому нравятся методы расширения, этот способ помогает нам.

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

(Пространство имен системы, поэтому оно доступно почти автоматически для всех наших строк.)

5 голосов
/ 28 марта 2014

Основываясь на ответе Марка выше (и комментариях Гео), я создал двухстрочную версию для удаления всех исключений ASCII из строки. Предусмотрено для людей, которые ищут этот ответ (как я).

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)); 
1 голос
/ 17 июля 2016

Если вы хотите 8-битное представление символов, которые используются во многих кодировках, это может вам помочь.

Вы должны изменить переменную targetEncoding на любую нужную кодировку.

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