Интеллектуальный UTF-8 в UTF-7 в .NET - PullRequest
3 голосов
/ 31 июля 2009

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

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

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

1 Ответ

5 голосов
/ 31 июля 2009

Если старая система действительно может правильно обрабатывать 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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...