2016-08-23 27 views
-1

私は非常に奇妙な動作をしている次のコードを持っています。Python sys.argv utf-8 unicodeが動作しない

私が次のことをすると、utf-8はユニコードにうまく変換されました。

print u'\xE1\x80\x96\xE1\x80\xBB\xE1\x80\xB1\xE1\x80\xAC\xE1\x80\xBA\xE1\x80\x9B\xE1\x80\x8A\xE1\x80\xBA'.encode('raw_unicode_escape') 

これは問題なく動作します。しかし、sys.argvからutf-8文字列を取得しても、それは動作しません。

import sys  

if __name__ == "__main__": 
    args = sys.argv 

    input_string = args[1] 

    if type(input_string) is not unicode: 
     input_string = unicode(input_string, "utf-8") 

    print type(input_string) 
    print input_string 

私は次、

python test_print.py "\xE1\x80\x96\xE1\x80\xBB\xE1\x80\xB1\xE1\x80\xAC\xE1\x80\xBA\xE1\x80\x9B\xE1\x80\x8A\xE1\x80\xBA" 

私は次のように同じ文字列を得たように実行すると、それはユニコードに変換されません。

<type 'unicode'> 
\xE1\x80\x96\xE1\x80\xBB\xE1\x80\xB1\xE1\x80\xAC\xE1\x80\xBA\xE1\x80\x9B\xE1\x80\x8A\xE1\x80\xBA 

入力をsys.argvからユニコード文字に変換する必要があります。

助けてください。

ありがとうございました。

答えて

2

実際のPythonレベルの文字列リテラル(strunicode)は、自動的にPythonによって解析される文字エスケープの場所です。あなたはこのようなリテラルのエスケープを使用して外部に文字列を変換したい場合は、explicitly invoke the literal escape interpretation machineryに、このような何かをしたい:

# Converts from str to str interpreting escapes, then decodes those bytes 
# using the UTF-8 encoding 
input_string = args[1].decode('string_escape').decode('utf-8') 

正確な手順は、(Pythonの3がわずかに異なっているあなたはunicode_escapecodecsモジュールを使用する必要がありますさらにテキストをデコードする前にstrbytesに変換するには、utf-8と入力してください。ただし、テキスト - >テキストのエンコードとデコードはサポートされていません)。

+0

これはさらに優れています。ありがとう。 – moeseth

関連する問題