これは古い質問であることは知っていますが、同様の状況に遭遇し、受け入れられた回答がいくつかのコーナーをカットしていることがわかりました(Jon Skeetの実用的な短い回答を無視しませんが、もう少し肉付けします)...
仕様では、ヘッダーの直後にエンコーディングが含まれると記載されています{\rtf:
\ansi ANSI (デフォルト)
\mac アップル マッキントッシュ
\pc IBM PC コード ページ 437
\pca IBM PC コード ページ 850、IBM Personal System/2 で使用 (Microsoft Word for OS/2 のバージョン 1 には実装されていません)
ウィキペディアによると、「ANSI 文字セットには明確な意味がありません」
デフォルトの ANSI では、これらの部分的に互換性のないエンコーディングを選択できます。
using System.Text;
...
string content = File.ReadAllText(filename, Encoding.GetEncoding("ISO-8859-1"));
or
string content = File.ReadAllText(filename, Encoding.GetEncoding("Windows-1252"));
Windows 10 でワードパッドを使用してユーロ記号 (Windows-1252 では 0x80、ISO-8859-1 では 0xA4) を含むファイルを保存すると、次のことが明らかになりました。
ヘッダーには、後の正確なエンコーディングが記載されています\ansi
{\rtf1\ansi\ansicpg1252\deff0\nouicompat\deflang1043{ ...
また、エンコーディングは直接使用されず、代わりに RTF エンコーディングでラップされました。\'80
仕様によると:
\'hh : 指定された文字セットに基づく 16 進値 (8 ビット値の識別に使用される場合があります)。
{\rtf1\ansi\ansicpg1252
ファイルが で始まる場合は、ヘッダーを読み取るのが最善の方法だと思いますWindows-1252
。
しかし、事態をさらに複雑にするために、仕様にはエンコーディングが混在する可能性があることも記載されています...「\upr」を検索してください...
決定的な答えはないと思います。あなたの場合の最も簡単な方法は、ソースベースで遭遇する可能性のあるエンコードされた著作権記号のすべてのバリエーションを (デコードされていない生のバイト配列で) 検索することです。
私の場合、最終的にいくつかのコーナーをカットすることにしましたが、防御的なコーディングを少し追加しました。これまでに見たすべてのファイルはWindows-1252
、そのために一般的なケースで最適化されたものでした。
Encoding encoding = Encoding.GetEncoding("Windows-1252", EncoderFallback.ReplacementFallback, DecoderFallback.ReplacementFallback);
using (System.IO.StreamReader reader = new System.IO.StreamReader(filename, encoding)) {
string header= reader.ReadLine();
if (!header.Contains("cpg1252")) {
if(header.Contains("\\pca"))
encoding = Encoding.GetEncoding(850, EncoderFallback.ReplacementFallback, DecoderFallback.ReplacementFallback);
else if (header.Contains("\\pc"))
encoding = Encoding.GetEncoding(437, EncoderFallback.ReplacementFallback, DecoderFallback.ReplacementFallback);
else
encoding = Encoding.GetEncoding("ISO-8859-1", EncoderFallback.ReplacementFallback, DecoderFallback.ReplacementFallback);
}
}
string content = System.IO.File.ReadAllText(filename, encoding);