暗号化されているページのタイトルはどのようにすれば、取得できますでしょうか?教えていただきたくよろしくお願いします。開発環境はVC++6です。
企業のページで暗号化されているページは極めて少ないと思います。(互換性や、サーチエンジンにかからなくなるなど問題があるため)
文字コードが異なるだけではないでしょうか?
一度、そのページのソースを、K2Editorなどの、UnicodeやEUCに対応したエディタで開いてみてください。
企業のページで暗号化されているページは極めて少ないと思います。(互換性や、サーチエンジンにかからなくなるなど問題があるため)
文字コードが異なるだけではないでしょうか?
一度、そのページのソースを、K2Editorなどの、UnicodeやEUCに対応したエディタで開いてみてください。
回答ありがとうございます。
たしかにEUCでした。
しかし、http://auctions.yahoo.co.jp/jp/
のように文字コードの種類charsetが記述されていないHPもあるので、文字コードの判定が難しそうですね。
Yahoo!オークションのページでは、HTTPヘッダで文字コードが指定されているようです。
HTMLの仕様上、こちらが最優先となります。
1. HTTPにおけるContent-Typeヘッダのcharsetパラメータ
2. HTML文書内のMETA宣言およびhttp-equiv属性で設定された、Content-Typeヘッダのcharsetパラメータ
3. HTML文書内の各要素のcharset属性
Webブラウザが文字コードを判定する基準:iBook G4 Blog
HTTPヘッダ・・・意識の外にありました。教えていただき大感謝です。しかし調べてみてもHTTP情報はどのように読み取ればいいのか、、、、
なかなか解りません。
参考になるリンクなどありましたら教えていただけませんか?
HTTPのヘッダ情報の取得ですが、どのようなAPIを使っているかによります。
WININET APIであれば、以下のように取得できます。
(1)HttpOpenRequest(サーバへのHTTPリクエスト準備)
(2)HttpSendRequest(サーバへのHTTPリクエスト送信)
(3)HttpQueryInfo(サーバからのHTTPレスポンス取得)
(4)InternetReadFile(データの取得)
MFC I/Fについてはこちら
サンプルはこのあたりでしょうか。
HttpQueryInfoでサーバから受信したHTTPレスポンスヘッダの情報を取得できます。第2パラメータにHTTP_QUERY_CONTENT_TYPEを指定するとContent-Typeフィールドを取得できます。
ただし、HTTPヘッダの情報はHTTP仕様上規定されているものですが、必ずしもすべてのWebサーバが正しい文字コードを返すとは限りません。たいていの場合はあっていますが、間違っている場合や明示されていない場合もありえます。
HTML内のcharset情報は、さらに当てになりません(すべきではありません)。これは、Webサーバにコンテンツをアップロードした後、Webサーバ側が文字コードを勝手に変換してしまう場合があるためです。
一番確実なのは、受信したデータを分析して自分で文字コードを判別することですが、これは難しいですし、EUCやシフトJISの仕様上100%確実に見分ける手段がないため、アルゴリズムが公開されていることはあまりないです。
これは公開されている例。
http://rryu.sakura.ne.jp/nisenise-fuhito/200204.html#2002-04-29
回答ありがとうございます。教えていただいた方法で、
HTTPヘッダから文字コードを取得できるようになりました
しかし、文字コード判定で
ユーザが入力した値を優先しようと思っていたのですが、
サーバーにより自動変換されていることがあるんですね。
HTTPも完全ではないし、
勉強に文字コードを解析する方法を考えるのもいいかも・・・(けどむずかしそ)
教えていただいた、サンプルを拝見し勉強してみます。
あれっ?
そういえば私のプログラムではSHIFT-JISの
文字ならなんの変換をしなくても、普通に読み取ることが
できるのですが、これはマシンの言語設定などがSHIFT-JISなど
になっているからなんですか?
もしそうだとすると、
UTF-8の環境で文字を取得するには、
UTF-8の文字列に変換する必要があるのでしょうか?(EUCも同様の理解)
何度もお手数をおかけしますがどうか教えてください。
日本語Windowsの環境では、何もしなければシフトJISで記述された文字列を扱うことができます。UTF-8やEUCが使えるようになっている環境は設定上は可能ですが通常はまずありえません。
Windowsの文字コードの扱いは、Unicode(UTF-16)とそれ以外(マルチバイト系)に基本的に分かれます。システムである時点で同時に使えるマルチバイト系文字コードは、1種類のみで、これはシステムロカールにより決定され、コードページと呼ばれます。
日本語Windowsであれば、通常はコードページ932となっており、これは日本語(シフトJIS)の環境が選択されていることを意味します。仕組み上は、UTF-8やEUCをデフォルトコードページとして選択することは可能ですが、一般のアプリケーションはそのような環境で動作できるようにはできていませんので、そのような設定がされている環境は通常はありません。
Unicodeとマルチバイト系の文字コードは、MultiByteToWideChar()またはWideCharToMultiByte()のAPIで相互変換が可能です。
第一引数はコードページを指定するもので、通常はCP_ACPやCP_OEMCPを使っていると思いますが、この場合はデフォルトの932(シフトJIS)が使われます。
第一引数に直接 65001 (UTF-8のコードページ)や、51932 (EUCのコードページ)を指定すると、UTF-8<->Unicode(UTF-16)や、EUC<->Unicodeのコード変換が行えます。
教えていただきありがとうございます。勉強になります。HttpQueryInfoでたまに文字コード情報を取得できないことがあるので取得文字コードの判定処理を組み込もうと思っているのですが、結構むずかしいですね。まだいろいろお聞きしたいこともあるのですが、本来の質問内容からずれてきたので本質門は終了します。
ardarimさんのお陰で少し前に進むことが出来ました。感謝です。
回答ありがとうございます。
たしかにEUCでした。
しかし、http://auctions.yahoo.co.jp/jp/
のように文字コードの種類charsetが記述されていないHPもあるので、文字コードの判定が難しそうですね。