質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

文字コード

文字コードとは、文字や記号をコンピュータ上で使用するために用いられるバイト表現を指します。

Q&A

解決済

1回答

3033閲覧

GASでfetchするときの文字コードについて

kokawa2003

総合スコア217

Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

文字コード

文字コードとは、文字や記号をコンピュータ上で使用するために用いられるバイト表現を指します。

0グッド

0クリップ

投稿2020/08/17 07:46

GASでWEBページの文字コードを取るため以下のようなコードを書きました。

javascript

1 var res=UrlFetchApp.fetch(入力URL); 2 const headers = res.getHeaders(); 3 Logger.log(headers); 4 const contentType = headers['Content-Type'].replace(/\s+/g, ''); 5 //Logger.log(contentType); 6 const indexOfCharset = contentType.indexOf('charset='); 7 const indexOfCharset2 = contentType.indexOf('CHARSET='); 8 var code="" 9 if(indexOfCharset>=0) 10 code=contentType.substring(indexOfCharset + 8); 11 else if(indexOfCharset2>0) 12 code=contentType.substring(indexOfCharset2 + 8);

でこの出力された文字コードを見ていますがよく失敗している。
たとえば
http://boumurou.world.coocan.jp/island/
このページでやると
HEADERの値が
{Server=Apache, Last-Modified=Fri, 13 Jan 2017 08:13:39 GMT, Accept-Ranges=bytes, Date=Mon, 17 Aug 2020 07:27:59 GMT, Content-Length=7664, Content-Type=text/html, ETag="1df0-545f569485559", Connection=keep-alive}
となり、UTF-8がとれてないが、実際にページの内容をブラウザーで見ると
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
となっている。
なぜ取れないページがあるのだろうか?というのが質問です。
なお当然取れるページもあります。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2020/08/19 03:41

このケースのHTTPレスポンスヘッダのContent-Typeはtext/htmlでしかないので、(HTML4.01なので)ASCIIコードが仮定されるはずですが、HTTPレスポンスボディのHTMLの中のMETAタグでcharsetの指定があるので、ブラウザとしてはUTF-8で表示することになります。 https://www.w3.org/TR/html401/charset.html#h-5.2.2
kokawa2003

2020/08/19 06:27

コードとしてはこの後本文をよむわけですが、結論としては適当なコードを指定して res.getContentText(); としたあとメタタグから文字コードを取り出してもう一度それで res.getContentText(***); とするしかないって意味ですか?
退会済みユーザー

退会済みユーザー

2020/08/19 06:31

何のために何をしているのか分からないので、何の結論か分かりませんが、私が説明したのはブラウザーで見れる理由です。 ブラウザーと同じ仕様に従うならきちんとHTMLをパースして調べることになるでしょうね。
kokawa2003

2020/08/19 06:41

私がHTTPの仕組みを理解してませんでした。ヘッダーの内容は本文の<HEAD></HEAD>と常に一致すると思い込んでました。仕組みがわかったので解決とします。
guest

回答1

0

ベストアンサー

なぜ取れないページがあるのだろうか?というのが質問です。

サーバがサボってContent-Type: text/htmlだけで送っている、ということもあります。

投稿2020/08/17 07:51

maisumakun

総合スコア146018

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kokawa2003

2020/08/18 08:39

HTMLのパーサー系のライブラリがいくつかあると思いますがそれを使うと、ボケないのだろか?とおもいすがどうでしょうか?答えずらいこと書いてすみません
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問