- ベストアンサー
HTML文書の文字コードの判定法
- C#のWebClientクラスを使って文字コード不明のHTML文書をダウンロードする方法について解説します。
- 通常はシフトJISと仮定して読み込むが、文書中にEUC指定があった場合には再度EUCエンコード指定で読み込むこともあります。
- 文字コードを判定して適切なエンコード方法を選択するためには、一度データをバッファに読み込み、正規表現を使用して文字コードの指定を検索します。
- みんなの回答 (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; }
お礼
お教え、ありがとうございました 早速Memory Streamを使用した方法に改良しました 結果は良好です 助かりました、ありがとう!!!