みなさんはプログラムを組むときに、「日本語を出力しようとすると文字化けをする」という経験はありませんか?
私はあります。
Pythonで日本語を使うと文字化けを頻繁にします。
今回の記事では、その注意点と対策方法をお伝えしたいと思います。
では、今回の講義を始めます。
Pythonを使用する上での最大の注意点
私は、Python でコードを書く前に必ず調べることがあります。
Python での日本語処理です。
日本語を出力するコードを書いてデバックをする。
そうすると、文字化けをしている出力結果を面前に。。。
Python の強みは文字の扱いなのですが、日本語を扱うことは大の苦手です。
しかし、私たちは日本人なので日本人向けにプログラムを組んでいる場合は、基本的には日本語を使わざるおえません。
幾度となくPythonでプログラムを組んでも、日本語処理の方法を覚えることができません。
全然、複雑でもないのに覚えることができないので、いっそのことブログのネタにしてやろうと記事にすることを考えました。
覚えろよって話なのですが、覚えれないんですよね・・・笑
文字コードとは
まずは日本語の処理をしていくときに必要となる知識があります。
それが「文字コード」です。
皆さんは文字コードが何かご存知でしょうか?
このページをご覧いただいている人で文字コードを全く知らないという人は少ないと思います。
しかし、これから先のお話する上で必要となる知識なので、簡単にお伝えしておきます。
文字コードの定義
では、文字コードとは何か、なのです。
文字コードとは、コンピュータが理解できるように文字に番号を割り振ったものです。
もう少し分かりやすい言葉で表現するならば、私達の言葉をコンピュータが理解できる言葉に変換する機能です。
そして、コンピューターが理解できる言葉に変換するだけなのだから1つと思うかもしれません。
それは間違いなのです。
私たちの言葉も何種類もあるように、その幾千もの言葉に対応するためには文字コードも必然と増やさざるおえなかったのです。
UTF-8 (utf_8) | 世界で最も使われている文字コード |
Shift-JIS (shift_jis) | Microsoftが開発した文字コード。ASCIIに日本語を加えたもので、ASCⅡの亜種です。 |
ISO-2022-JP (iso2022_jp) | メールの送受信で使用されている文字コード。 |
EUC-JP (euc_jp) | ヨーロッパっぽいけど、Unixで使用されている文字コード。Extended Unix Codeの略。 |
Code Page 932 (cp932) | Shift-JISの亜種です。結構、目撃しますけどなんだか古臭い。 |
代表的な文字コードだけでもこれだけの数が存在しています。
この中でも最もよく使われているのが「UTF-8」です。
「 UTF-8 」が最も利用される理由
では、なぜ「UTF-8」はこんなにも人気となったのでしょうか。
その理由は簡単です。
ASCⅡと互換性がある規格だからです。
というのも、UTF-8はASCⅡに日本語などの仕様を足した仕様なのです。
UTF-8を使えば、英語も日本語もどちらも使えて超便利なんてことになります。
たぶんなので保証はありませんが・・・
Python2系と3系での文字コードの違い
ここまで文字コードについてお伝えしてきました。
では、なぜ最初に文字コードについてお伝えしたのかです。
その理由は、Pythonで日本語が扱いにくい理由は文字コードにあるからです。
その理由をこれから説明していきたいと思います。
ここで注意しておいて欲しいことがあります。
それはPythonの2系と3系は全くの別物であるということです。
まったく互換性がありませんので、3系のコードを2系で活かそうとかはできません。
過去に主流であったPython2系
2系が主流であった頃のPythonは、日本を含むアジアで使われることを全く想定していませんでした。
そのため採用された文字コードも「ASCⅡ」でした。
日本語の利用を想定してない文字コードなので、当然ですが、「日本語を使いますよ~」という文字コード宣言文が必須です。
世界中で主流になりつつあるPython3系
3系では、日本を含むアジアで使われることを想定して開発されました。
そのため採用された文字コードも「UTF-8」となりました。
文字コードが変更されたことで、文字コード宣言文を記述しなくても日本語を利用することができるようになりました。
Python2系では文字コード宣言文が必要
Python2系の文字コードはASCⅡを採用しているので、日本語を扱うことが仕様上困難です。
そのため文字コード宣言文を記述することなく日本語を出力しようすると、日本語の部分が処理できずに文字化けしてしまいます。
これを回避するために、「日本語を使いますよ~」という文字コード宣言文を記述するわけです。
これから実際にどのように記述すればいいのかをお伝えします。
Pythonの日本語処理の方法
ここから先のお話はPython2系のみに該当するお話です。
Python3系で採用されている文字コードはUTF-8なので、やややこしいことをしなくても日本語を扱うことができます。
① ファイルの文字コードを「UTF-8」にする
コードを書くときも保存するときも「 UTF-8 」で行いましょう。
理由は前述した通り、「UTF-8」だとどのOSでも文字化けすることなく開くことが可能です。
なにより、英語も日本語も問題なく使えるのでストレス無く生きていけます。
② 文字コード宣言文(エンコーディングを記述する)
# -*- coding: エンコーディング名 -*-
エンコーディング名には「utf-8」と記述します。
この文字コード宣言をすることによって、「今後、このPythonファイルはUTF-8として記述しますよ」という意味になります。
これで日本語が文字化けすることなくPythonをデバックすることができます。
③ 注意点
ただ、注意点があります。この注意点はよく理解しておいてください。
ファイル | 文字コード宣言文 |
Shift-JIS | UTF-8 |
と、ファイルの文字コードと文字コード宣言文の文字コードが違っていた場合の話です。
ファイル内のコードはShift-JISで書かれているのに、文字コード宣言でUTF-8として処理することを宣言しています。
両者が違う文字コードで処理しようとしているため、文字化けがおきます。
必ずこの2つの文字コードは一致させておいてください。
その他の日本語の扱い方
出力する際は『u”○○○”』とする。
print u"○○○"
出力する際の手法は違う方法でも可能ですので、以下に書いておきます。
基本的に代入する処理するときなどに使う手法ですので、あまり使うことがありません。
utf-8 → unicode にデコードする方法
str = "○○○" print str.decode('utf-8')
utf-8→unicodeに変換方法
str = "○○○" print unicode(str,'utf-8')
上記の方法で日本語が文字化けせずに表示されます。
まとめ
Pythonは3系になってからすごく扱いやすくなりました。
Python2系までは毎回文字コード宣言をする必要がありました。
PloneやDjangoなどのPythonで開発されたCMSを利用するときは、毎回面倒でした。
ほんとうにPython3系がリリースされたのは偉大でした。
それでもPython2系の保守をするときがくるかもしれませんので、そのときは参照してください。
最後におまけでPython3系の日本語処理の方法をお伝えして終わりたいと思います。
Python3系はデフォルトで「UTF-8」のため日本語処理を意識しなくても使用可能。
日本語の扱い方
- Pythonファイルを「UTF-8」として作成する。
- Pythonファイルの先頭行に文字コード宣言文を記述する。
今回の講義はこれで終わります。
では、またお会いしましょう!