2016-01-15 172 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如何接收它的语言环境。 –