🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
文字コード

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

14394閲覧

pythonにおけるdecodeのやり方

kkron4221

総合スコア8

文字コード

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2019/12/02 12:57

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

python

1import base64 2 3str_encode = b'''PGRpdiBkaXI9Imx0ciI+W+aKleeov+aXpeaZgl0gMjAxOeW5tDA55pyIMTTml6UgMTfmmYIxM+WI 4hjE056eSPGJyPuKWoFvms6jmlofjg5Xjgqnjg7zjg6BdPGJyPuODu+ODnuODhOOCqOOCrygzMDAw 55YaGKSAxMeWAiyA9IDMzMDAw5YaGPGJyPuODu+OCsOODq+ODvCgyMDAw5YaGKSA2N+WAiyA9IDEz 6NDAwMOWGhjxicj7CoFvlkIjoqIhdIDE2NzAwMOWGhjxicj7jgYrlkI3liY0gwqAgwqAgwqAgwqAg 7OiDmgbXmr5Tlr7/lupc8YnI+44Oh44O844Or44Ki44OJ44Os44K5IDogPGEgaHJlZj0ibWFpbHRv 8OmguaTAzMTRybkBnbWFpbC5jb20iPmguaTAzMTRybkBnbWFpbC5jb208L2E+PGJyPuKWoOODoeOD 9g+OCu+ODvOOCuDxicj50ZXN0PGJyPlvjg5Xjgqnjg7zjg6Dmg4XloLFdPGJyPuODleOCqeODvOOD 10oElEIDogUzE1ODQyNzkwPGJyPuODleOCqeODvOODoOWQjSA6IOODoeODvOODq+ODleOCqeODvOOD 11oDxicj7nqK7liKUgwqAgwqAgwqAgOiDjg5Pjgrjjg43jgrko5pyJ5paZKTxicj7lhazplovmnJ/p 12mZAgwqAgOiDnhKHmnJ/pmZA8YnI+5a6a5ZOhIMKgIMKgIMKgIDog54Sh5Yi26ZmQPGJyPuODreOC 13sOS7tuaVsCDCoCA6IDM8YnI+44Ot44Kw44Kk44OzVVJMOiA8YSBocmVmPSJodHRwczovL3d3dy5m 14b3JtenUuY29tL2xvZ2luX2Zvcm0vUzE1ODQyNzkwIj5odHRwczovL3d3dy5mb3JtenUuY29tL2xv 15Z2luX2Zvcm0vUzE1ODQyNzkwPC9hPjxicj48L2Rpdj4NCg==''' 16 17 18print(type(str_encode)) 19 20 21ans = base64.b64decode(str_encode) 22print(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'

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

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

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

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

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

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

guest

回答2

0

ベストアンサー

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

Python

1print(ans.decode())

ですかね。

投稿2019/12/02 13:05

otn

総合スコア85886

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

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

kkron4221

2019/12/03 11:03

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

2019/12/03 12:54 編集

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 を参照。
kkron4221

2019/12/04 02:28

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

0

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

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

投稿2019/12/02 13:01

Takumiboo

総合スコア2536

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問