文字列の中で「\」を扱うのは面倒。
今回間違えたこと。
Windowsパス名の区切りを「\」から「/」に変換
スクリプトの引数にWindowsのパスを指定して、それをsys.argvで取得した場合、その中は「\」がエスケープされて「\\」となっているので、そのまま使う分には困らない。
「\」の扱いが面倒だらと、パスの区切りを「/」に書き換えておくならばこう書くこと。
runpath = path.replace('\\', '/')
日本語をUnicodeにエンコードしたバイト列を表したUTF-8
Python内で使っていたUTF-8の日本語は、外部(ファイルやhttpなど)に出すときにエンコードされてしまう。
本来は、どうエンコードされるかを理解して、それに適切なデコード処理をしてあげればいいのだが、
それを自分のロジック内で制御するために、Unicodeにエンコードして、そのバイト列をUTF-8で表した形で流通させて、使う側が逆にエンコード・デコードして元の日本語に戻すやりかたを使っている。
1 2 3 4 5 6 7 8 9 10 |
>>> a = '日本語' >>> b = a.encode('unicode-escape') >>> c = b.decode('utf-8') >>> print(a,b,c) 日本語 b'\\u65e5\\u672c\\u8a9e' \u65e5\u672c\u8a9e >>> d = c.encode() >>> e = d.decode('unicode-escape') >>> print(e) 日本語 |
Unicodeを表したUTF-8文字列が上記のように変数に入ったままなら問題ないのだが、直接表記する場合は「\」の対処が必要。
何もしないと、正しくデコードできない。
1 2 3 4 5 |
>>> x='\u65e5\u672c\u8a9e' >>> y=x.encode() >>> z=y.decode('unicode-escape') >>> print(x,y,z) 日本語 b'\xe6\x97\xa5\xe6\x9c\xac\xe8\xaa\x9e' æ¥æ¬èª |
row文字列として扱えばOK。
1 2 3 4 5 |
>>> x=r'\u65e5\u672c\u8a9e' >>> y=x.encode() >>> z=y.decode('unicode-escape') >>> print(x,y,z) \u65e5\u672c\u8a9e b'\\u65e5\\u672c\\u8a9e' 日本語 |