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

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

ただいまの
回答率

90.00%

pythonにおけるdecodeのやり方

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 71

kkron4221

score 4

現在gmailで所得した文字列をデコードする作業をしています。
decodeを行うサイトで取得した文字列を入力すると望んでいた内容が出力されるのですが、以下のコードで書き表すとうまくいきません。

import base64

str_encode = b'''PGRpdiBkaXI9Imx0ciI+W+aKleeov+aXpeaZgl0gMjAxOeW5tDA55pyIMTTml6UgMTfmmYIxM+WI
hjE056eSPGJyPuKWoFvms6jmlofjg5Xjgqnjg7zjg6BdPGJyPuODu+ODnuODhOOCqOOCrygzMDAw
5YaGKSAxMeWAiyA9IDMzMDAw5YaGPGJyPuODu+OCsOODq+ODvCgyMDAw5YaGKSA2N+WAiyA9IDEz
NDAwMOWGhjxicj7CoFvlkIjoqIhdIDE2NzAwMOWGhjxicj7jgYrlkI3liY0gwqAgwqAgwqAgwqAg
OiDmgbXmr5Tlr7/lupc8YnI+44Oh44O844Or44Ki44OJ44Os44K5IDogPGEgaHJlZj0ibWFpbHRv
OmguaTAzMTRybkBnbWFpbC5jb20iPmguaTAzMTRybkBnbWFpbC5jb208L2E+PGJyPuKWoOODoeOD
g+OCu+ODvOOCuDxicj50ZXN0PGJyPlvjg5Xjgqnjg7zjg6Dmg4XloLFdPGJyPuODleOCqeODvOOD
oElEIDogUzE1ODQyNzkwPGJyPuODleOCqeODvOODoOWQjSA6IOODoeODvOODq+ODleOCqeODvOOD
oDxicj7nqK7liKUgwqAgwqAgwqAgOiDjg5Pjgrjjg43jgrko5pyJ5paZKTxicj7lhazplovmnJ/p
mZAgwqAgOiDnhKHmnJ/pmZA8YnI+5a6a5ZOhIMKgIMKgIMKgIDog54Sh5Yi26ZmQPGJyPuODreOC
sOS7tuaVsCDCoCA6IDM8YnI+44Ot44Kw44Kk44OzVVJMOiA8YSBocmVmPSJodHRwczovL3d3dy5m
b3JtenUuY29tL2xvZ2luX2Zvcm0vUzE1ODQyNzkwIj5odHRwczovL3d3dy5mb3JtenUuY29tL2xv
Z2luX2Zvcm0vUzE1ODQyNzkwPC9hPjxicj48L2Rpdj4NCg=='''


print(type(str_encode))


ans = base64.b64decode(str_encode)
print(ans)


以下の出力が返ります

b'<div dir="ltr">[\xe6\x8a\x95\xe7\xa8\xbf\xe6\x97\xa5\xe6\x99\x82] 2019\xe5\xb9\xb409\xe6\x9c\x8814\xe6\x97\xa5 17\xe6\x99\x8213\xe5\x88\x8614\xe7\xa7\x92<br>\xe2\x96\xa0[\xe6\xb3\xa8\xe6\x96\x87\xe3\x83\x95\xe3\x82\xa9\xe3\x83\xbc\xe3\x83\xa0]<br>\xe3\x83\xbb\xe3\x83\x9e\xe3\x83\x84\xe3\x82\xa8\xe3\x82\xaf(3000\xe5\x86\x86) 11\xe5\x80\x8b = 33000\xe5\x86\x86<br>\xe3\x83\xbb\xe3\x82\xb0\xe3\x83\xab\xe3\x83\xbc(2000\xe5\x86\x86) 67\xe5\x80\x8b = 134000\xe5\x86\x86<br>\xc2\xa0[\xe5\x90\x88\xe8\xa8\x88] 167000\xe5\x86\x86<br>\xe3\x81\x8a\xe5\x90\x8d\xe5\x89\x8d \xc2\xa0 \xc2\xa0 \xc2\xa0 \xc2\xa0 : \xe6\x81\xb5\xe6\xaf\x94\xe5\xaf\xbf\xe5\xba\x97<br>\xe3\x83\xa1\xe3\x83\xbc\xe3\x83\xab\xe3\x82\xa2\xe3\x83\x89\xe3\x83\xac\xe3\x82\xb9 : <a href="mailto:h.i0314rn@gmail.com">h.i0314rn@gmail.com</a><br>\xe2\x96\xa0\xe3\x83\xa1\xe3\x83\x83\xe3\x82\xbb\xe3\x83\xbc\xe3\x82\xb8<br>test<br>[\xe3\x83\x95\xe3\x82\xa9\xe3\x83\xbc\xe3\x83\xa0\xe6\x83\x85\xe5\xa0\xb1]<br>\xe3\x83\x95\xe3\x82\xa9\xe3\x83\xbc\xe3\x83\xa0ID : S15842790<br>\xe3\x83\x95\xe3\x82\xa9\xe3\x83\xbc\xe3\x83\xa0\xe5\x90\x8d : \xe3\x83\xa1\xe3\x83\xbc\xe3\x83\xab\xe3\x83\x95\xe3\x82\xa9\xe3\x83\xbc\xe3\x83\xa0<br>\xe7\xa8\xae\xe5\x88\xa5 \xc2\xa0 \xc2\xa0 \xc2\xa0 : \xe3\x83\x93\xe3\x82\xb8\xe3\x83\x8d\xe3\x82\xb9(\xe6\x9c\x89\xe6\x96\x99)<br>\xe5\x85\xac\xe9\x96\x8b\xe6\x9c\x9f\xe9\x99\x90 \xc2\xa0 : \xe7\x84\xa1\xe6\x9c\x9f\xe9\x99\x90<br>\xe5\xae\x9a\xe5\x93\xa1 \xc2\xa0 \xc2\xa0 \xc2\xa0 : \xe7\x84\xa1\xe5\x88\xb6\xe9\x99\x90<br>\xe3\x83\xad\xe3\x82\xb0\xe4\xbb\xb6\xe6\x95\xb0 \xc2\xa0 : 3<br>\xe3\x83\xad\xe3\x82\xb0\xe3\x82\xa4\xe3\x83\xb3URL: <a href="https://www.formzu.com/login_form/S15842790">https://www.formzu.com/login_form/S15842790</a><br></div>\r\n'

なぜ日本語でなく、このような文字列が帰ってくるのでしょうか?
公式リファレンスも読んだのですが、何が原因でうまくいかないのかがうまく理解できません。
教えていただけると幸いです。
よろしくお願いします。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+4

b64decodeの返すのはバイト列なので、

print(ans.decode())


ですかね。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/12/03 20:03

    うまく行きました、ありがとうございます。
    後学のために教えていただけると嬉しいのですが、base64.decodeしたのになぜdecode()を行うことで正しい日本語が得られるのでしょうか?
    私の考えでは、文字列を1度デコードをすれば正しい日本語が返ってくると考えていたので、少し府に落ちません。
    何か有用なサイトか、書籍だけでも教えて頂ければ幸いです。
    よろしくお願いします。

    キャンセル

  • 2019/12/03 21:22 編集

    base64.decodeというのは、base64というエンコード方法の戻しで、結果はバイト列(バイナリー)になります。
    バイト列と文字列は区別のない言語もありますが(バイト列を文字列で代用)、Pythonは別々です。
    文字列とバイト列の変換は、encode/decodeを使います。
    https://docs.python.org/ja/3/library/stdtypes.html の str.encode と、
    https://docs.python.org/ja/3/library/stdtypes.html の bytes.decode を参照。

    キャンセル

  • 2019/12/04 11:28

    理解の助けになりました。ありがとうございます。

    キャンセル

0

文字がUTF-8でエンコードされているからでしょう。

Python でUTF-8, shift_jis, euc_jpなど日本語を使う方法

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 90.00%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる