UTF-8 文字の文字列があり、それらを古いシステムに UTF-7 として出力する必要がある場合、これに関して 2 つの質問があります。
UTF-8 文字を含む文字列 s を、それらの文字を含まない同じ文字列に効率的に変換するにはどうすればよいですか?
「O」のような拡張文字を最も近い拡張されていない同等の「O」に変換する簡単なものはありますか?
古いシステムが実際に UTF-7 を適切に処理できるのであれば、なぜ何かを削除したいのでしょうか? 文字列を UTF-7 としてエンコードするだけです。
string text = LoadFromWherever(Encoding.UTF8);
byte[] utf7 = Encoding.UTF7.GetBytes(text);
次に、UTF-7 でエンコードされたテキストを古いシステムに送信します。
元の UTF-8 でエンコードされたバイトがある場合は、これを 1 ステップで実行できます。
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);