エンコーディングについての質問:どのようにStringWriterへHtmlAgilityPackからI出力とは、エンコーディングを保つことができますか?
-
12-09-2019 - |
質問
私はその後、それを編集し、HtmlAgilityPackでHTMLを読み込むのStreamWriterに出力しています。 HtmlAgilityPackエンコーディングはLatin1のである、とのStreamWriterはUnicdeEncodingです。
私は、変換中にいくつかの文字を失う、と私はなりたくない。
私はのStreamWriterのエンコードを変更することはできていないようです。この問題を回避する最善のは何ですか?
解決
、それはそれでどんなカーリー引用符を持つことはできません。ラテン-1は、これらの文字のためのマッピングを持っていません。あなたはカーリー引用符を見ることができる場合は、お使いのブラウザでページを開いたとき、彼らはHTMLエンティティ(“
と”
または“
と”
)の形である可能性があります。しかし、私は、ページのエンコーディングは、ヘッダと埋め込まれた宣言の言うことにもかかわらず、本当に窓-1252である疑いがあります。
は、Windows-1252は、より有用な(または少なくともきれい)印刷文字で\x80..\x9F
範囲(小数128..159
)に制御文字を置き換えることを除いてラテン-1と同一です。 HtmlAgilityPackはその言葉にページを取って、ISO-8859-1として、それをデコードしている場合、それはあなたがそれがすべてで表示するように得ることができるかどうかをゴミのようになります。これは、制御文字\x93
に\u0093
を変換します。ブラウザが、一方、それは、左ダブルクォーテーションマークのUnicodeコードポイントを\u201C
に変換されます。
私はHtmlAgilityPackに慣れていないだと私はそれのために任意のドキュメントを見つけることができませんが、私は、Windows 1252を使用するように強制しようとするだろう。たとえば、Windows-1252(または「ANSI」)のStreamReaderを作成することができますし、HAPは、それを使用しています。
他のヒント
の推測では、 Stream
(ないstring
)に書き込みます。あなたはstring
(INC。StringWriter
/ StringBuilder
に書き込む場合は、暗黙のうちに、.NETのUTF-16の文字列を使用しています。
string
を使用)したい場合は、、そしてジョンのを見てここを答えます。
あなたがで文字を失っているどのエンド明確ではありません。いずれにせよ、単なるエンコーディングの不一致は、それ自体で問題ではない - あなたはまだ正しい文字を得ることになっています。ユニコードのStreamWriterは、文字化けを書き出した場合は、それが最初の場所での入力にゴミを受けていたことを意味します。これはおそらくHtmlAgilityPackが間違ったページのエンコーディングを得たことを意味します。それは手動でエンコーディングを設定するオプションを持っている場合、あなたはちょうどそれをしたい場合があります。
また、あなたがそれで間違ったエンコーディング宣言を持つHTMLページを持っている可能性があります。例えば。それはラテン-1としてそれを宣言する<meta>
要素が含まれているUTF-8のファイルかもしれません。どこからテキストを得るのですか?そして、それは後者だ場合、どのようにそのファイルを作成します - あなたはまっすぐのWebからダウンロード、またはテキストファイルでそれを持っていますか?あなたはStreamWriter
を経由して、メモ帳を経由して、またはコードで手動でそれをやった場合は、UTF-8のファイルを持っているかもしれません。