Интеллектуальный UTF-8 в UTF-7 в.NET
Если у меня есть строка символов UTF-8, и они должны быть выведены на более старую систему как UTF-7, у меня есть два вопроса, касающихся этого.
Как эффективно преобразовать строку s, содержащую символы UTF-8, в одну и ту же строку без этих символов?
Есть ли простой способ преобразования расширенных символов, таких как "'", в их ближайший не расширенный эквивалент "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);