Как преобразовать (транслитерировать) строку из utf8 в ASCII (однобайтовый) в c #?
-
20-08-2019 - |
Вопрос
У меня есть строковый объект
"с несколькими символами и даже специальными символами"
Я пытаюсь использовать
UTF8Encoding utf8 = new UTF8Encoding();
ASCIIEncoding ascii = new ASCIIEncoding();
объекты для того, чтобы преобразовать эту строку в ascii.Могу я попросить кого-нибудь пролить немного света на это простое задание, которым является охота моего дня.
ПРАВКА 1:Чего мы пытаемся достичь, так это избавиться от специальных символов, таких как некоторые специальные апострофы Windows.Код, который я опубликовал ниже в качестве ответа, не позаботится об этом.В основном
О'Брайан станет О?Брайаном.где ' - один из специальных апостроф
Решение
Это было в ответ на ваш другой вопрос, который, похоже, был удален .... суть все еще остается в силе.
Выглядит как проблема с классическим переводом Unicode в ASCII.Хитрость заключалась бы в том, чтобы найти где это происходит.
.NET отлично работает с Unicode, предполагая говорят, что это Юникод для начала (или оставить по умолчанию).
Мой догадываюсь заключается в том, что ваше принимающее приложение не может с этим справиться.Так что, я бы, вероятно, использовал ASCII - кодер с ан Кодировщик замещенияfallback со строкой.Пусто:
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...ну, по крайней мере, те из нас, кто живет в США.;)
Другие советы
Я был в состоянии разобраться в этом.На случай, если кто-то захочет узнать ниже код, который сработал у меня:
ASCIIEncoding ascii = new ASCIIEncoding();
byte[] byteArray = Encoding.UTF8.GetBytes(sOriginal);
byte[] asciiArray = Encoding.Convert(Encoding.UTF8, Encoding.ASCII, byteArray);
string finalString = ascii.GetString(asciiArray);
Дайте мне знать, если есть более простой способ сделать это.
Для всех, кому нравятся методы расширения, этот вариант подойдет для нас.
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;
}
}
}
(Системное пространство имен, поэтому оно доступно практически автоматически для всех наших строк.)
Основываясь на приведенном выше ответе Марка (и комментарии Гео), я создал двухстрочную версию, чтобы удалить все случаи исключения 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));
Если вам нужно 8-битное представление символов, которые используются во многих кодировках, это может вам помочь.
Вы должны изменить переменную Целевое кодирование в любую кодировку, которую вы хотите.
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);