2016-01-15 260 views
-1

我必須在我的python文件的輸入參數上使用貨幣符號。那麼,但我不知道,如何將其轉換爲可用的方式。Python - sys.argv特殊符號(€,¢,₪等)

例子:

我輸入:

--amount 100.0 --input_currency € --output_currency CZK 

我得到什麼了€符號:

\x80 

我需要得到:

u'\u20ac' 

我試着使用解碼('utf-8'),但它沒有工作,它返回:

UnicodeDecodeError: 'utf8' codec can't decode byte 0x80 in position 0: invalid start byte 

你能幫助我嗎?

+0

您正在使用的操作系統會影響您編程的參數的編碼方式。你在使用什麼操作系統? –

回答

1

在POSIX系統上,它完全取決於您的控制檯或終端如何配置這些字符串使用的編碼。

在這些環境中,使用locale.getpreferredencoding()來查詢配置了什麼編碼,然後用它來解碼字符串。這是不是萬無一失的,但應該在控制檯或終端正確配置時工作。

在特定情況下,你可能使用的是Windows系統配置爲使用Windows Codepage 1252

>>> '\x80'.decode('cp1252') 
u'\u20ac' 
>>> print '\x80'.decode('cp1252') 
€ 

Windows不提供GetCommandLineW()CommandLineToArgvW()功能檢索命令行的Unicode值,然後解析那個值變成了一個類似於argv的數組;從Python使用這個可以用ctypes library來完成;釋義this example這是你如何使用它:

from ctypes import WINFUNCTYPE, windll, POINTER, byref, c_int 
from ctypes.wintypes import LPWSTR, LPCWSTR 
GetCommandLineW = WINFUNCTYPE(LPWSTR)(("GetCommandLineW", windll.kernel32)) 
CommandLineToArgvW = WINFUNCTYPE(POINTER(LPWSTR), LPCWSTR, POINTER(c_int))(("CommandLineToArgvW", windll.shell32)) 

argc = c_int(0) 
argv_unicode = CommandLineToArgvW(GetCommandLineW(), byref(argc)) 
+0

...因爲你正在使用代碼頁1252,所以你將不能使用''',因爲這個字符不存在於那個代碼頁中。 Windows控制檯不適合與Unicode做任何事情。 – bobince

0

在Python 3中,sys.argv已經是Unicode字符串列表。你不需要做任何事情。

在Python 2上,在Windows上,您應該使用use Unicode API (CommandLineToArgvW(), GetCommandLineW())。它允許傳遞無法使用當前OEM代碼頁表示的字符,例如cp437(chcp結果)。

在Python 2上,在POSIX上,sys.argv[i]可能是一個任意的字節序列。通常情況下,它可以使用源自Linux上的語言環境的sys.getfilesystemencoding()進行編碼。

請參閱Best way to decode command line inputs to Unicode Python 2.7 scripts

+0

然後,Linux似乎與我的Mac OS X終端有所不同,它是確定命令行參數如何編碼的* locale *。這是確定我的終端輸入如何編碼以及Bash如何接收它的語言環境。 –