我正在使用OptParse
模块来检索字符串值。 OptParse
only supports str
typed strings,而非unicode
。
所以让我说我用以下内容开始我的脚本:
./someScript --some-option ééééé
法语字符,例如'é',键入str
,在代码中读取时触发UnicodeDecodeError
:
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 99: ordinal not in range(128)
我使用unicode内置函数玩了一下,但是我得到一个错误,或者字符消失了:
>>> unicode('é');
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 0: ordinal not in range(128)
>>> unicode('é', errors='ignore');
u''
使用OptParse
检索unicode
/ utf-8
字符串有什么办法吗?
更新:
似乎可以检索并打印字符串,但是我尝试将该字符串与sqlite一起使用(使用APSW模块),并尝试使用cursor.execute("...")
以某种方式转换为unicode,然后发生错误。
以下是导致错误的示例程序:
#!/usr/bin/python
# coding: utf-8
import os, sys, optparse
parser = optparse.OptionParser()
parser.add_option("--some-option")
(opts, args) = parser.parse_args()
print unicode(opts.some_option)
答案 0 :(得分:4)
您可以在解析器处理它们之前解码参数。举个例子:
#!/usr/bin/python
# coding: utf-8
import os, sys, optparse
parser = optparse.OptionParser()
parser.add_option("--some-option")
# Decode the command line arguments to unicode
for i, a in enumerate(sys.argv):
sys.argv[i] = a.decode('ISO-8859-15')
(opts, args) = parser.parse_args()
print type(opts.some_option), opts.some_option
这给出了以下输出:
C:\workspace>python file.py --some-option préférer
<type 'unicode'> préférer
我选择了ISO/IEC 8859-15代码页,因为它似乎最合适。如果需要,请进行调整。
答案 1 :(得分:1)
输入以控制台编码返回,因此根据您更新的示例,使用:
print opts.some_option.decode(sys.stdin.encoding)
unicode(opts.some_option)
默认使用ascii
作为编码。
答案 2 :(得分:0)
我认为您的错误与following:
有关例如,要编写包含欧元货币的Unicode文字 符号,可以使用ISO-8859-15编码,带有欧元符号 具有序数值164.该脚本将打印值8364 (对应于欧元符号的Unicode代码点)然后 退出:
# -*- coding: iso-8859-15 -*-
currency = u"€"
print ord(currency)
答案 3 :(得分:0)
#!/usr/bin/python
# coding: utf-8
import os, sys, optparse
reload(sys)
sys.setdefaultencoding('utf-8')
parser = optparse.OptionParser()
parser.add_option(u"--some-option")
(opts, args) = parser.parse_args()
print opts.print_help()