3

如果我有一串 UTF-8 字符并且需要将它们作为 UTF-7 输出到旧系统,我有两个与此相关的问题。

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

  2. 是否有任何简单的将扩展字符(如“Ō”)转换为最接近的非扩展等效字符“O”?

4

1 回答 1

6

如果旧系统实际上可以正确处理 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);
于 2009-07-30T20:58:35.400 回答