私は、Python でコードを書く前に必ず調べることがあります。
Python での日本語処理です。
コードを書き始めた最初は全く気づかずに書くのですが、日本語を出力するコードを書いてデバックすると、文字化けして気付きます。
実はPythonの最大のネックは日本語を扱うことです。Pythonの強みは文字の扱いなのですが、その文字の扱いで日本語を扱うことがとても苦手なのです。
しかし、私はそれが分かっていても日本人なので日本語を使います。そのため、毎回ネットで日本語処理の方法を探しています。
それもいよいよ面倒くさいので、ブログで一挙にまとめておこうかと思います(覚えろよって話だったりするんですけ・・・)。
Python2系と3系での違い
Pythonで日本語が使いにくい理由は、Pythonが採用している文字コードに原因があります。
Python2系
以前に主流であった、Python2系で採用されていた文字コードは「ASCⅡ」でしたので、日本語を使いますよ~という文字コード宣言文が必須でした。
Python3系
しかし、現在主流のPython3系で採用されている文字コードは「UTF-8」となりました。
よって、現在では文字コード宣言文を記述しなくても日本語が難なく使うことができますので、特段注意することも無いと思います。
しかし、それでも「文字コード」の意味や宣言文の詳細を知りたい方は、下にお進みください。
文字コード
日本語処理するときに必要な知識があります。
「文字コード」です。
文字コードをご存知でしょうか?このページを見ている人で文字コードをご存知ではないという人は少ないかもしれませんが、一応説明しておこうと思います。
文字コードとは、コンピュータが理解できるように文字に番号を割り振ったものです。もう少し分かりやすい言葉で表現するならば、私達の言葉をコンピュータがが理解できる言葉にしている機能です。
その文字コードにも種類があります。代表的なものは以下です。
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」はこんなにも人気となったのでしょうか。
その理由は簡単です。ASCⅡと互換性がある規格だからです。
英字などの一部の文字はASCⅡと同じ仕様で、その他の部分、日本語などを表現するための仕様を足すなどUTF-8ならでの仕様もあります。
そんなこんなで「UTF-8」にしていれば日本語も英語も使えて便利でハッピーなんてことになるかもしれません。たぶん。
Pythonの日本語処理の方法
① ファイルの文字コードを「UTF-8」にする
コードを書くときも保存するときも「 UTF-8 」で行いましょう。
理由は前述した通り、「UTF-8」だとどのOSでも文字化けすることなく開くことが可能です。なにより、英語も日本語も問題なく使えるのでストレス無く生きていけます。
② 文字コード宣言文(エンコーディングを記述する)
# -*- coding: エンコーディング名 -*-
エンコーディング名には「utf-8」と記述します。
この文字コード宣言をすることによって、「今後、このPythonファイルはUTF-8として記述しますよ」という意味になります。
これで日本語が文字化けすることなくPythonをデバックすることができます。
注意点
ただ、注意点があります。この注意点はよく理解しておいてください。
ファイル | UTF-8 |
文字コード宣言文 | Shift-JIS |
と、ファイルの文字コードと文字コード宣言文の文字コードが違っていた場合の話です。
ファイルはUTF-8と処理をしようとしているので、文字化けがおきます。無理矢理、Shift-JISとして処理をしようとしているからです。
この2つの文字コードは必ず一致させておいてください。
その他の日本語の扱い方
出力する際は『u”○○○”』とする。
print u"○○○"
出力する際の手法は違う方法でも可能ですので、以下に書いておきます。
基本的に代入する処理するときなどに使う手法ですので、あまり使うことがありません。
utf-8 → unicode にデコードする方法
str = "○○○" print str.decode('utf-8')
utf-8→unicodeに変換方法
str = "○○○" print unicode(str,'utf-8')
上記の方法で日本語が文字化けせずに表示されます。
まとめ
あまりまとめを書くのは好きではないのですが、ちょっと流行りに便乗してみます。
Python3系はデフォルトで「UTF-8」のため日本語処理を意識しなくても使用可能。
日本語の扱い方
- Pythonファイルを「UTF-8」として作成する。
- Pythonファイルの先頭行に文字コード宣言文を記述する。
どうですか?そんなに難しくないですよね。
もし保守作業でPython2系を使うことがあれば参考にしてみてください。