[Python]マルチバイト文字をはじく

今、パイプライン的なツールなぞを作成しているんですが、日本語ディレクトリ(存在してはまずいと思うけど)が見つかったらはじきたい、と思いました。
MayaのGUIは普通に日本語表示出来ちゃうんですが、そもそも日本語ディレクトリはプロダクションで使用するディレクトリストラクチャに存在したらマズいし、Pythonだと日本語の扱いは意識してないとたまにおかしなことになるっぽい、というかまったく意識してなかったらおかしなことになったので、いっそのこと全部はじいてしまえ、ということで方法を探しました。


探せども探せども出てこなくて困った、と思っていたんですが、
もしやasciiにエンコードしてしまえば存在しない文字(つまりマルチバイト)はエンコードエラーになる?と思いつき、早速試しました。

以下ソース。

s = '日本語文字列'
s.encode('ascii', 'strict')

これでUnicodeEncodeErrorが出ました。
ってことはあとはtry, exceptすれば、と。
よし、解決。

上記はstrオブジェクトの場合ですがunicodeオブジェクトでも同じようにencode関数が使えるみたいです。

ちなみにstrictはエラーを出力して処理を停止するモードで、
replaceにすると変換出来ないものは?に変換して、とりあえず変換してくれます。
ignoreだと、とりあえずすっとばして変換出来るものだけ変換してくれるようです。
デフォルトはどうやらstrictになっているようですが、明示的にするという意味で書いてみました。

と、ここまで書いて問題発生。
上記コード部分を、確認のためにコマンドプロンプトからPython立ち上げて実行したところ、エラーが起きました。
どの文字コードに変更しようとしてもダメ。
最初に実行した時は普通に動いたのになーーんーーーでーーーー、と思っていろいろ調べてたら、どうやらシステムのデフォルトエンコーディングがasciiになってるからっぽいくさいことが判明。
asciiの文字列として扱われたっぽく、そんな文字コードねーよと冷たくあしらわれたみたいです。
何故最初は上手くいったんだ、、、もしや気のせい??
がーん

で、システムのデフォルトエンコーディングは以下の通り確認可能です。

import sys
sys.getdefaultencoding()

でもシステムのデフォルトが何であれ、今回はascii以外を全部問答無用ではじきたいだけなのでエラーが出ればOK。
なのでこの問題はスルーすることにしました。
それで良いのか、、、という気もしますが、まぁ、、良いです。

あとこれは余談ですが、以下の方法であればstrからunicode文字に変更することが出来ました。

s = '日本語文字列'
u = unicode(s, 'shift-jis')

さらにunicodeオブジェクトに変換した後なら、encode関数使えました。
euc-jpとかにしたら文字化けましたが。

んー、、マルチバイト文字の扱いって面倒ですね。。。

Python3000では全部unicodeに統一らしいので、今後はちょっとこの辺も意識しておくべき、、かも?

なんか意図せずいろいろ覚えること多くなっているような、、、

「[Python]マルチバイト文字をはじく」への4件のフィードバック

  1. >hohehohe2さん
    あ、それ今utf-8で使ってます。
    なんでutf-8かと言えば、なんとなく最近良く見るからみたいな適当な感じですが。。。
    今Doxygen用のコメントを、若干不本意ではありますが日本語で書いていて。
    まぁ普段怪しい英語でコメント書いてるので、当然の結果なのですがww
    で、その時に文字コード問題にぶち当たりまして。utf-8にしました。
    日本語コメント使う場合ってファイルの文字コードをマルチバイトにしてやらないと動かないんですね。。びっくりしました。。
    参考リンク&毎度コメントありがとうございますーーーっ。

  2. これが今いちばん困ってる部分だったりします。

    会社だと完全英語環境なのでなんの問題も無かったのに、
    家のXPで動かしてみたらデスクトップのファイルも開けない!(日本語パス)
    公開したら、やっぱ日本語コメント書く人もいるよなぁ。文字コードちゃんと対応しないとなぁ・・・って感じで。

  3. >hajimeさん
    あーーー、なるほど。
    僕よりもhajimeさんの方がキツい状況に見えます、、、ww
    文字コードって、なんだかなぁ!
    嫌な問題です。。

コメントを残す

メールアドレスが公開されることはありません。