Как преобразовать (транслитерировать) строку из utf8 в ASCII (один байт) в С#?
У меня есть строковый объект
"с несколькими символами и даже специальными символами"
Я пытаюсь использовать
UTF8Encoding utf8 = new UTF8Encoding();
ASCIIEncoding ascii = new ASCIIEncoding();
чтобы преобразовать эту строку в ascii. Могу ли я попросить кого-нибудь принести свет этой простой задаче, которая охотится днем.
ИЗМЕНИТЬ 1:
То, что мы пытаемся достичь, - это избавиться от специальных символов, таких как некоторые специальные апострофы окон. Код, который я написал ниже в качестве ответа, не позаботится об этом. В основном
О'Брайан станет O? Брайаном. где "является одним из специальных апострофов
Ответы
Ответ 1
Это было в ответ на ваш другой вопрос, похоже, что он был удален... точка все еще стоит.
Похож на классический Unicode на ASCII-версию. Фокус в том, чтобы найти, где это происходит.
.NET отлично работает с Unicode, предполагая, что он сказал Unicode для начала (или оставил по умолчанию).
Я предполагаю, что ваше приложение-получатель не сможет его обработать. Итак, я бы, вероятно, использовал ASCIIEncoder с a 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... ну, те из нас в США, по крайней мере.;)
Ответ 2
Я смог понять это. Если кто-то хочет знать ниже код, который работал у меня:
ASCIIEncoding ascii = new ASCIIEncoding();
byte[] byteArray = Encoding.UTF8.GetBytes(sOriginal);
byte[] asciiArray = Encoding.Convert(Encoding.UTF8, Encoding.ASCII, byteArray);
string finalString = ascii.GetString(asciiArray);
Сообщите мне, есть ли более простой способ сделать это.
Ответ 3
Для тех, кто любит методы расширения, этот делает трюк для нас.
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;
}
}
}
(Системное пространство имен, поэтому оно доступно почти автоматически для всех наших строк.)
Ответ 4
Основываясь на ответе Mark выше (и комментарий Geo), я создал две версии liner для удаления всех исключений 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));
Ответ 5
Если вы хотите 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);