Интеллектуальный UTF-8 в UTF-7 в.NET

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

  1. Как эффективно преобразовать строку s, содержащую символы UTF-8, в одну и ту же строку без этих символов?

  2. Есть ли простой способ преобразования расширенных символов, таких как "'", в их ближайший не расширенный эквивалент "O"?

1 ответ

Решение

Если старая система действительно может правильно обрабатывать UTF-7, зачем вам что-то удалять? Просто закодируйте строку как UTF-7:

string text = LoadFromWherever(Encoding.UTF8);
byte[] utf7 = Encoding.UTF7.GetBytes(text);

Затем отправьте текст в кодировке UTF-7 в более старую систему.

Если у вас есть оригинальные байты в кодировке UTF-8, вы можете сделать это за один шаг:

byte[] utf7 = Encoding.Convert(Encoding.UTF8, Encoding.UTF7, utf8);

Если вам действительно нужно конвертировать в ASCII, вы можете сделать это достаточно легко.

Чтобы удалить не-ASCII символы:

var encoding = Encoding.GetEncoding
    ("us-ascii", new EncoderReplacementFallback(""), 
     new DecoderReplacementFallback(""));
byte[] ascii = encoding.GetBytes(text);

Чтобы преобразовать не-ASCII в ближайший эквивалент:

string normalized = text.Normalize(NormalizationForm.FormKD);
var encoding = Encoding.GetEncoding
    ("us-ascii", new EncoderReplacementFallback(""), 
     new DecoderReplacementFallback(""));
byte[] ascii = encoding.GetBytes(normalized);
Другие вопросы по тегам