6

我正在使用该OptParse模块来检索字符串值。OptParse只支持str类型化的字符串,不支持unicode

所以假设我开始我的脚本:

./someScript --some-option ééééé

在代码中读取时,键入的法语字符(例如“é”)会str触发s: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 模块),并尝试使用 以某种方式转换为 unicode cursor.execute("..."),然后发生错误。

这是导致错误的示例程序:

#!/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

4 回答 4

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代码页,因为它似乎最适合您。如果需要,进行调整。

于 2012-10-29T13:16:56.783 回答
1

输入以控制台编码返回,因此根据您更新的示例,使用:

print opts.some_option.decode(sys.stdin.encoding)

unicode(opts.some_option)默认使用ascii作为编码。

于 2012-10-30T12:12:51.867 回答
0

我相信您的错误与以下内容有关:

例如,要编写包含欧元货币符号的 Unicode 文字,可以使用 ISO-8859-15 编码,欧元符号的序数值为 164。此脚本将打印值 8364(对应于欧元符号的 Unicode 代码点) 然后退出:

# -*- coding: iso-8859-15 -*-

currency = u"€"
print ord(currency)
于 2012-10-29T12:56:21.873 回答
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()
于 2014-10-29T08:15:07.263 回答