実際に何らかのエンコードを手動で選択することはできますが(別のサイトにアクセスしたときにそれを無効にすることを忘れないでください)、実際にはWebサイトで正しく指定されているはずです。サーバーまたはWebページ自体のいずれかが何かを指定する必要があります。それ以外の場合、ブラウザーでできることは、何らかの最良の推測を行うことだけです。そしてもちろん、エンコードが指定されている場合、HTMLドキュメントは実際にそのエンコードを使用する必要があります。以下に示すように、質問のWebサイトにはそれほど多くありません。
Webサーバーが何かを指定しているかどうかを確認するには、いわゆるheadersを調べる必要があります。web-sniffer.netのオンラインサービスを使用して、取得するヘッダーを明らかにします。
HTTP / 1.1 200 OK
日付:月、2009年8月17日17:47:03 GMT
サーバー:Apache
最終更新日:月、2006年11月27日23:38:49 GMT
ETag: "758b0606-1a316-4234309151440"
Accept-Ranges:バイト
コンテンツの長さ:107286
接続:閉じる
コンテンツタイプ:text / html; charset = utf-8(BOM UTF-16、リッテエンディアン)
最後の行は少し奇妙に思えます:サーバーがUTF-8とUTF-16の両方であると主張する方法は?の値は、IANAに登録されてcharset
いるものの1つである必要があります(たとえば、コメントなしのUTF-8)。ただし、オンラインサービスではなくWiresharkパケットスニッファーを使用すると、テキスト(BOM UTF-16、リッテエンディアン)は実際にはWebサーバーから送信されたものではなく、オンラインサービスからのコメントであることがわかります。
そのため、Webサーバーは、UTF-8でエンコードされたHTMLドキュメントを送信すると主張しています。
ただし、次のHTMLドキュメントは間違っています(読みやすいように編集されています)。
ÿþ<!DOCTYPE html PUBLIC "-// W3C // DTD HTML 4.01 Transitional // EN">
<html>
<head>
<title>レッスン5 </ title>
<meta http-equiv = "Content-Type" content = "text / html; charset = utf-8">
<link href = "main.css" rel = "stylesheet" type = "text / css">
</ head>
...
上記では、コンテンツタイプを指定する行が内で最初に表示されます。<head>
そうしないと、ブラウザは内の特殊文字の処理方法を認識できません<title>
。さらに重要なのは、最初の2つの奇数文字、ÿþ
実際には16進コードFFおよびFEであり、既に説明したオンラインサービスと同様に、UTF-16(リッテエンディアン)のバイトオーダーマークです。
そのため、WebサーバーはUTF-8を送信することを約束しましたが、その後、UTF-16 LEを示すマーカーを送信しました。次に、HTMLドキュメントでは、再びUTF-8を使用していると主張しています。
実際、Wiresharkは、実際のHTMLドキュメントがUTF-16エンコードされていることを示しています。これは、すべての文字が少なくとも2バイト(オクテット)を使用して送信されることを意味します。の6文字の<html>
ように、12個の16進バイトとして送信されます3C 00 68 00 74 00 6D 00 6C 00 3E 00
。ただし、この非常にWebサイトは、非ASCII文字をまったく使用していないように見えるため、プレーンASCIIである可能性が非常に高くなります。代わりに、HTMLソースは次のような数字参照(NCR)でいっぱいです。
यह दिल्ली
शहर है।
ブラウザには、上記のように表示されます。ただし、NCRとUTF-16を使用するため、単一文字using(Unicode U + 092F)は、26 00 23 00 32 00 33 00 35 00 31 00 3B 00
NCR य
を使用して書き込まれ、NCR の7つのASCII文字はUTF-16を使用してエンコードされるため、で最大 14バイト。NCRを使用しない場合、UTF-8ではこの単一のに3バイト(E0 A4 AF
)、UTF-16では2バイト(09 2F
)が必要です。
このHTMLソースでは、UTF-16を使用すると帯域幅が無駄に消費され、サーバーも圧縮を使用しません。