如何使用OptParse检索具有非ASCII字符的字符串?

时间:2012-10-29 12:48:54

标签: python unicode ascii

我正在使用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)

4 个答案:

答案 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()