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

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

新規登録して質問してみよう
ただいま回答率
85.46%
Go

Go(golang)は、Googleで開発されたオープンソースのプログラミング言語です。

UTF-8

UTF-8は8ビット符号単位の文字符号化形式及び文字符号化スキームです。データ交換方式、ファイル形式としては、一般的にUTF-8が使われる傾向があります。

文字コード

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

Q&A

解決済

1回答

1529閲覧

go言語の文字コード変換について

study_program

総合スコア2

Go

Go(golang)は、Googleで開発されたオープンソースのプログラミング言語です。

UTF-8

UTF-8は8ビット符号単位の文字符号化形式及び文字符号化スキームです。データ交換方式、ファイル形式としては、一般的にUTF-8が使われる傾向があります。

文字コード

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

0グッド

0クリップ

投稿2021/01/31 23:06

go言語で何か作りたいなと思いgoqueryとおなじよなmyqueryというライブラリを作ろうとしたとき、ネットから得たhtmlをファイルに保存しようとしたら文字化けが起こってしまいました。文字コード変換サイトでこの文字化けした文字をもどそうとした結果iso-8859-1のutf-8で正常の文字になりました。

go言語

1package myquery 2 3import ( 4 "io/ioutil" 5 "log" 6 "net/http" 7 "os" 8 9) 10 11type documentQuery struct { 12 html string 13} 14 15func NewDocument(url string) *documentQuery { 16 res, err := http.Get(url) 17 if err != nil { 18 log.Fatal(err) 19 } 20 document, err := ioutil.ReadAll(res.Body) 21 if err != nil { 22 log.Fatal(err) 23 } 24 var total string 25 for _, j := range document { 26 if string(j) == ">" { 27 total += string(j) 28 //total+="\n" 29 continue 30 } 31 total += string(j) 32 } 33 34 defer res.Body.Close() 35 return &documentQuery{ 36 html: total, 37 } 38} 39func (d *documentQuery) search() bool { 40 if d.html != "" { 41 return true 42 } 43 log.Fatal("なにも入っていませんん") 44 return false 45} 46 47func (d *documentQuery) Save(name string) { 48 if d.search() == true { 49 file, err := os.Create(name) 50 if err != nil { 51 log.Fatal(err) 52 } 53 54 file.WriteString(d.html) 55 } 56}

これをgoのライブラリで文字化けせずにファイルに保存する方法を教えてください。

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

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

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

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

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

nobonobo

2021/01/31 23:46

パース時なのか保存時なのか表示なのか。どの段階で文字コードミスマッチがあったのかが不明なのでどこにミスマッチがあったのか切り分けをお願いします。コード上はなにも変換を行わずパススルーの状態に見えます。 切り分けが難しいのなら具体的なサイトURLと保存したファイルを追記してください。
guest

回答1

0

ベストアンサー

問題点を予測して回答すると(違っていたらすいません)、
ブラウザには「デフォルトエンコード」という考え方があります。
いろんなサイトをスクレイピングするにはそれを意識する必要があると思います。

以下の優先順位でHTMLの文字エンコードが決定します。
0. 「<meta http-equiv="Content-Type" content="text/html; charset=????"/>」もしくは「<meta charset="????"/>」の解釈
0. 「<html lang="??">...」の解釈
0. 言語ごとの「デフォルトエンコード」

追記

性善説であればHTMLドキュメントの書き手が望んでいるエンコードを具体的に記述していることを期待していいのですが、最悪の場合、自国言語を指定すらせず、自国言語のデフォルトエンコード任せのHTMLを書いてしまっている場合などもあります。(さすがにもう減ってきているとは思いますが)そのようなものもスクレイピングの対象に含めたい場合は文字コードの判定ライブラリを利用する必要があったりします。

投稿2021/01/31 23:49

編集2021/02/01 00:05
nobonobo

総合スコア3367

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

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

nobonobo

2021/02/03 01:09

もう少し具体的な補足をすると、 iso-8859-1は7bitパススルーです。 utf-8は8bitパススルーです。 つまり文字コード変換サイトにて変換に相当する処理は全く行われていません。 元のコンテンツをUTF-8で表示さえすれば表示できたんじゃないかなと思います。 つまり、あなたの表示環境のデフォルトエンコードがUTF-8ではなく、コンテンツにはエンコード指定がなされていなかった。というのが予想です。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問