• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:HTML文書の文字コードの判定法)

HTML文書の文字コードの判定法

このQ&Aのポイント
  • C#のWebClientクラスを使って文字コード不明のHTML文書をダウンロードする方法について解説します。
  • 通常はシフトJISと仮定して読み込むが、文書中にEUC指定があった場合には再度EUCエンコード指定で読み込むこともあります。
  • 文字コードを判定して適切なエンコード方法を選択するためには、一度データをバッファに読み込み、正規表現を使用して文字コードの指定を検索します。

質問者が選んだベストアンサー

  • ベストアンサー
  • nfonfonfo
  • ベストアンサー率63% (12/19)
回答No.1

1、WebClientを使用する前提ならば、MemoryStreamに内容を書き出してそこから文字判定する方法で可能かと。 ※)注意点として  MemoryStreamを読み終えた後、次のStreamReaderで読めるようにSeekで先頭位置に設定する必要があります。 2、Webサーバーから帰ってくるhttpヘッダ(Content-Type)でも文字コードの判別は可能です。   ContentType = MyClient.ResponseHeaders[System.Net.HttpResponseHeader.ContentType]; //以下ソース using System.IO; using System.Text.RegularExpressions; using System.Net; const string Address = @"http://oshiete.goo.ne.jp/"; string ContentType = string.Empty; string ReadString = string.Empty; using (MemoryStream mem = GetMemoryStream(Address, out ContentType)) { //Postionを先頭にする。 mem.Seek(0, SeekOrigin.Begin); StreamReader MyReader = new StreamReader(mem, System.Text.Encoding.GetEncoding("Shift_JIS")); ReadString = MyReader.ReadToEnd(); Regex r = new Regex(@"charset\s*=\s*euc-jp", RegexOptions.IgnoreCase); if (r.IsMatch(ReadString)) { //Postionを先頭にする。 mem.Seek(0, SeekOrigin.Begin); MyReader = new StreamReader(mem, System.Text.Encoding.GetEncoding("EUC-JP")); ReadString = MyReader.ReadToEnd(); } } public MemoryStream GetMemoryStream(string Address, out string ContentType) { MemoryStream mem = new MemoryStream(); using (WebClient MyClient = new WebClient()) { using (Stream MyStream = MyClient.OpenRead(Address)) { // HTTPヘッダのContentTypeを取得する。 ContentType = MyClient.ResponseHeaders[HttpResponseHeader.ContentType]; byte[] buffer = new byte[4096]; while (true) { int read = MyStream.Read(buffer, 0, buffer.Length); if (read <= 0) { break; } mem.Write(buffer, 0, read); } } } return mem; }

sato-may
質問者

お礼

お教え、ありがとうございました 早速Memory Streamを使用した方法に改良しました 結果は良好です 助かりました、ありがとう!!!

関連するQ&A