エンコードやデコードを使う機会
概要
厳密な定義をすると難しいのでものすごく簡単にいうと
人間が読める普通の文字をコンピュータに読めるようにするのがエンコード
コンピュータが読む文字を人間の読める文字にするのがデコード
という認識でいい。
(厳密には違うが、とりあえずエンコードについて
「こういうときはこう設定すればエラーが起きない」
ということを知っていさえすればたいていなんとかなる)
エンコードしたものをデコードすると元に戻る。
ただの英数字はたいていコンピューターにはそのまま読めるので考える必要がない
しかし特殊な文字を使うとき
それを入力する場所によっては文字化けを起こしたり
エラーになってプログラムが止まってしまう
これはやり方によっては日本語でもうまく読み込めず
普通の日本語を書き込もうとするだけでエラーになったりする
これを防ぐためには
「どんなときにどのエンコードやデコード処理が必要か」
を覚えておくといい
使うときの例
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をつけないとエラーになって止まってしまうので注意。