0

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

因此,我正在尝试编写一个脚本来读取 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 是否会改变任何东西)?

4

1 回答 1

3

如果您正在使用打开输入文件,codecs.open()那么您有 unicode 数据,而不是编码数据。您只想 decode 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

不幸的是,sys.argv在 Windows 上显然会出现乱码,因为 Python 使用非 unicode 感知系统调用。请参阅在 Windows 上的 Python 2.x 中从命令行参数中读取 Unicode 字符,了解 Unicode感知替代方案。

我认为argparseUnicode 输入没有任何问题,但如果确实如此,您始终可以从 Unicode 输出中获取win32_unicode_argv()并将其编码为 UTF-8,然后再将其传递给argparse.

于 2013-05-24T23:34:05.150 回答