在Windows7中通过命令行输入python2.7 utf-8

时间:2013-05-24 23:17:56

标签: python windows-7 python-2.7 utf-8 command-line-arguments

我是新手,我确定过去曾问过类似的问题,但我无法找到/理解答案。提前感谢您对我的耐心!

所以我试图编写一个脚本来读取utf-8编码输入文件中的行,将它的一部分与用户传入的可选命令行参数进行比较,以及是否匹配,在将其打印到输出文件之前对该行执行一些操作。我使用codecs打开文件。

我现在使用argparse模块来解析命令行参数。文件中的行可以是各种语言,因此命令行参数也必须是utf-8。

例如:

文件中的一行可能如下所示:

разъедают {. r ax z . j je . d ax1 . ju t .}

应该从命令行调用脚本,如下所示:

>python myscript.py mytextfile.txt -grapheme ъ

这是我的代码中应该进行处理的部分。在这种情况下,orth是一些西里尔文本,grapheme是西里尔字符。

def process_orth(orth, grapheme):
    grapheme = grapheme.decode(sys.stdin.encoding).encode('utf-8')
    if (grapheme in orth):
        print 'success, your grapheme was: ' + grapheme.encode('utf-8')
        return True
    else:
        print 'failure, your grapheme was: ' + grapheme.encode('utf-8')
        return False

不幸的是,即使字形肯定存在,该函数返回false并打印一个问号而不是字形:

failure, your grapheme was: ?

根据我读过的其他帖子的建议,我已尝试在process_orth()开头添加以下内容,但它似乎无法正常工作:

grapheme.decode(sys.stdin.encoding).encode('utf-8')

所以我的问题是......

如何通过命令行将utf-8字符串传递给python脚本?另外,在Windows7上是否有任何额外的怪癖(并且安装了cygwin会改变什么)?

1 个答案:

答案 0 :(得分:3)

如果您使用codecs.open()打开输入文件,那么您将拥有unicode数据,不是编码数据。您只想解码grapheme,而不是再次将其编码为UTF-8:

grapheme = grapheme.decode(sys.stdin.encoding)
if grapheme in orth:
    print u'success, your grapheme was: ' + grapheme
    return True

请注意,我们打印 unicode;通常print将确保为您当前的代码页再次编码Unicode值。这可能仍然失败,因为Windows控制台打印非常困难,请参阅http://wiki.python.org/moin/PrintFails

不幸的是,Windows上的sys.argv显然会出现乱码,因为Python使用非unicode识别系统调用。有关支持unicode的替代方案,请参阅Read Unicode characters from command-line arguments in Python 2.x on Windows

我认为argparse没有理由对Unicode输入有任何问题,但如果确实如此,你总是可以从win32_unicode_argv()获取unicode输出并将其编码为UTF-8,然后再传递给它argparse