HtmlAgilityPack で html を読み込んで編集し、StreamWriter に出力しています。HtmlAgilityPack Encoding は Latin1 で、StreamWriter は UnicdeEncoding です。
変換でいくつかの文字が失われていますが、そうなってほしくありません。
StreamWriter のエンコーディングを変更できないようです。この問題を回避するのに最適なものは何ですか?
HtmlAgilityPack で html を読み込んで編集し、StreamWriter に出力しています。HtmlAgilityPack Encoding は Latin1 で、StreamWriter は UnicdeEncoding です。
変換でいくつかの文字が失われていますが、そうなってほしくありません。
StreamWriter のエンコーディングを変更できないようです。この問題を回避するのに最適なものは何ですか?
Web ページが実際に Latin-1 (ISO-8859-1) である場合、中括弧を含めることはできません。Latin-1 には、これらの文字のマッピングはありません。ブラウザーでページを開いたときに巻き引用符が表示される場合は、HTML エンティティ ( “
and”
または“
and ”
) の形式である可能性があります。しかし、ヘッダーと埋め込み宣言が何を言っているかにかかわらず、ページのエンコーディングは実際には windows-1252 であると思われます。
\x80..\x9F
windows-1252 は、範囲内の制御文字 (decimal 128..159
) をより便利な (または少なくともきれいな) 印刷文字に置き換えることを除いて、Latin-1 と同じです。HtmlAgilityPack がページをその単語で取得し、それを ISO-8859-1 としてデコードする場合\x93
、制御文字\u0093
に変換されます。これを表示できる場合は、ゴミのように見えます。一方、ブラウザは\u201C
、左二重引用符の Unicode コード ポイントである に変換します。
私は HtmlAgilityPack に精通しておらず、ドキュメントも見つかりませんが、windows-1252 を使用するように強制しようとします。たとえば、windows-1252 (または "ANSI") の StreamReader を作成し、HAP にそれを使用させることができます。
推測では; Stream
(ではなく)に書き込みstring
ます。string
(inc. StringWriter
/に書き込む場合はStringBuilder
、.NET の UTF-16 文字列を暗黙的に使用しています。
報告されたエンコーディングを微調整したいだけの場合(ただし a を使用string
)、Jon の回答 hereを参照してください。
どのエンドでキャラクターを失うかは明確ではありません。いずれにせよ、単なるエンコーディングの不一致自体は問題ではありません。正しい文字を取得する必要があります。Unicode StreamWriter が文字化けした文字を書き出す場合、それはそもそも入力時にガベージを受け取ったことを意味します。これはおそらく、HtmlAgilityPack がページのエンコーディングを間違っていたことを意味します。エンコーディングを手動で設定するオプションがある場合は、それを行うことをお勧めします。
また、間違ったエンコーディング宣言を含む HTML ページがある可能性もあります。<meta>
たとえば、Latin-1 として宣言する要素を含む UTF-8 ファイルである可能性があります。テキストはどこから入手しますか?Web から直接ダウンロードしますか、それともテキスト ファイルで入手しますか? 後者の場合、そのファイルをどのように作成しますか? メモ帳を使用して手動で行った場合、または を介してコードで行った場合StreamWriter
は、UTF-8 ファイルがある可能性があります。