我是新手,我确定过去曾问过类似的问题,但我无法找到/理解答案。提前感谢您对我的耐心!
所以我试图编写一个脚本来读取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会改变什么)?
答案 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
。