如果我有一串 UTF-8 字符并且需要将它们作为 UTF-7 输出到旧系统,我有两个与此相关的问题。
如何有效地将具有 UTF-8 字符的字符串 s 转换为没有这些字符的相同字符串?
是否有任何简单的将扩展字符(如“Ō”)转换为最接近的非扩展等效字符“O”?
如果旧系统实际上可以正确处理 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);