Pythonでコマンドライン引数に渡されたマルチバイト文字をunicode型に変換する

argparseでマルチバイト文字を渡すとバイト列型として取得される

unicode型として扱いたい場合はdecodeする必要があるが、エンコーディングをどうするべきか調べてた

多分sys.getfilesystemencodingを使えばいいんだと思うけど、macosxのpython2、python3でしか試していない。

windowsとかlinuxロケールの設定が特殊な場合とかも正常に動くかどうか不明

sample.py

# coding=utf-8
import sys
import argparse
import six

parser = argparse.ArgumentParser()
parser.add_argument("string", type=str)
args = parser.parse_args()

# 入力値
s = args.string

if isinstance(s, six.binary_type):
    fs_encoding = sys.getfilesystemencoding() or sys.getdefaultencoding()
    s = s.decode(fs_encoding)

print(s)
print(s.__class__)
print(len(s))

assert isinstance(s, six.text_type)


実行結果

python2.7.5

$ python test.py あいうえお
あいうえお
<type 'unicode'>
5

python3.3.2

$ python arg_encoding.py あいうえお
あいうえお
<class 'str'>
5