エンコードやデコードを使う機会


概要


厳密な定義をすると難しいのでものすごく簡単にいうと

人間が読める普通の文字をコンピュータに読めるようにするのがエンコード
コンピュータが読む文字を人間の読める文字にするのがデコード

という認識でいい。
(厳密には違うが、とりあえずエンコードについて
「こういうときはこう設定すればエラーが起きない」
ということを知っていさえすればたいていなんとかなる)

エンコードしたものをデコードすると元に戻る。

ただの英数字はたいていコンピューターにはそのまま読めるので考える必要がない
しかし特殊な文字を使うとき
それを入力する場所によっては文字化けを起こしたり
エラーになってプログラムが止まってしまう

これはやり方によっては日本語でもうまく読み込めず
普通の日本語を書き込もうとするだけでエラーになったりする

これを防ぐためには
「どんなときにどのエンコードやデコード処理が必要か」
を覚えておくといい

使うときの例

openなどを使って文字をテキストファイルに書き込むとき ギリシア文字などの特殊文字があると書き込むことができないことがある このときにはエンコード設定が必要で 書き込むときにutf-8をエンコード指定して書き込むとエラーが起きずに書き込める スクレイピング(ネットの文章を自動で集めたりするプログラム)するとき 検索キーワードに何か指定するときはエンコードしないとうまく指定できない


temp = "My Name is α"
print(temp)
print(temp.encode())
print(temp.encode(encoding='shift_jis'))

temp2 = b'My Name is \xce\xb1'
print(temp2.decode())
print(temp2.decode('shift_jis'))

変数tempに"My Name is α"を入れよ
tempを出力せよ
tempをutf-8でエンコードして出力せよ
tempをshitf-jisでエンコードして出力せよ

変数temp2にエンコード済み文字列'My Name is \xce\xb1'を入れよ
temp2をutf-8でデコードして出力せよ
temp2をshift-jisデコードして出力せよ

出力


My Name is α
b'My Name is \xce\xb1'
b'My Name is \x83\xbf'
My Name is α
My Name is ホア

説明


最後の行ではutf-8でエンコードしたものを
shift-jisでエンコードしたので
元に戻らずおかしな文字になっている

ギリシア文字のアルファは特殊文字なので
そのままではコンピューターが読めないため
読めるようにエンコードしてみる

エンコードされた文字は普通の文字ではなく
b'My Name is \xce\xb1'のように頭にbがついている
コンピューターがαという文字を出せない場合は
その代り\xce\xb1という英数字の組み合わせでαを表現している
という感じ

α イコール \xce\xb1

となる

エンコードのパターンがたくさんあって
utf-8というのは世界共通で一番よく使われているエンコードの方法なので
特殊な理由がない限りはいつもこれを使うといい
そしてencode()のように何も指定しないとutf-8を指定したことになる

試しにshift-jisという形式でエンコードしてみると
utf-8とは違う形で出てきたことがわかる

スクレイピングなどするときはエンコードが必要なので
いろいろなエンコード形式で試してみてうまくいったらそれを使うといい
日本の場合はたいていutf-8かshift-jisでうまくいくことが多い

よくわからなかったらとりあえずいろんなエンコードやデコードで試してみれば
そのうちうまくいったりする
それでもわからなければstackoverflow(外国の本家サイト)などで検索するといい

間違えやすい問題



temp2 = 'My Name is \xce\xb1'
print(temp2.decode())

のように、エンコード済みのデータは
頭にbをつけないとエラーになって止まってしまうので注意。