.NET中的UTF-8智能UTF-7

max*_*dbe 3 .net utf-8 utf-7

如果我有一串UTF-8字符,并且需要以UTF-7的形式输出到旧系统,我有两个与此有关的问题.

  1. 如何将具有UTF-8字符的字符串s转换为没有这些字符的相同字符串?

  2. 是否有任何简单的转换扩展字符,如'?' 他们最接近的非延伸等价'O'?

Jon*_*eet 5

如果旧系统可以正确处理UTF-7,为什么要删除任何东西呢?只需将字符串编码为UTF-7:

string text = LoadFromWherever(Encoding.UTF8);
byte[] utf7 = Encoding.UTF7.GetBytes(text);
Run Code Online (Sandbox Code Playgroud)

然后将UTF-7编码的文本发送到旧系统.

如果你有原始的UTF-8编码字节,你可以一步完成:

byte[] utf7 = Encoding.Convert(Encoding.UTF8, Encoding.UTF7, utf8);
Run Code Online (Sandbox Code Playgroud)

如果您确实需要转换为ASCII,则可以合理地轻松完成.

要删除非ASCII字符:

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

要将非ASCII转换为最近的等效值:

string normalized = text.Normalize(NormalizationForm.FormKD);
var encoding = Encoding.GetEncoding
    ("us-ascii", new EncoderReplacementFallback(""), 
     new DecoderReplacementFallback(""));
byte[] ascii = encoding.GetBytes(normalized);
Run Code Online (Sandbox Code Playgroud)