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

在Windows7中通过命令行输入python2.7 utf-8,python,windows-7,python-2.7,utf-8,command-line-arguments,Python,Windows 7,Python 2.7,Utf 8,Command Line Arguments,我是个新手,我相信过去也有人问过类似的问题,但我很难找到/理解答案。提前感谢您对我的耐心 因此,我试图编写一个脚本来读取utf-8编码的输入文件中的行,将其部分内容与用户传入的可选命令行参数进行比较,如果有匹配项,则在将其打印到输出文件之前对该行执行一些操作。我正在使用编解码器打开文件 我现在正在使用argparse模块解析命令行参数。文件中的行可以是各种语言,因此命令行参数也需要是utf-8 例如: 文件中的一行可能如下所示: r ax z.j j j.d ax1.ju t. 应从命令行调用脚

我是个新手,我相信过去也有人问过类似的问题,但我很难找到/理解答案。提前感谢您对我的耐心

因此,我试图编写一个脚本来读取utf-8编码的输入文件中的行,将其部分内容与用户传入的可选命令行参数进行比较,如果有匹配项,则在将其打印到输出文件之前对该行执行一些操作。我正在使用
编解码器
打开文件

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

例如:

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

r ax z.j j j.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
不幸的是,尽管grapheme确实存在,但函数返回false并打印问号而不是grapheme:

失败,您的图形名是:?

根据我读到的其他帖子的建议,我尝试在
process_orh()
的开头添加以下内容,但似乎没有效果:

grapheme.decode(系统标准编码).encode('utf-8')

所以我的问题是…


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

如果您使用
codecs.open()
打开输入文件,则您使用的是unicode数据,而不是编码数据。您只需要解码
图形名
,而不是将其再次编码为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控制台打印非常困难,请参阅

不幸的是,Windows上的sys.argv显然会被乱码,因为Python使用了一个不支持unicode的系统调用。有关支持unicode的替代方案,请参阅


我看不出
argparse
有任何Unicode输入问题的原因,但如果有问题,您可以始终从
win32\u Unicode\u argv()
获取Unicode输出,并将其编码到UTF-8,然后再将其传递到
argparse

如果您使用
编解码器打开输入文件。open()
则您有Unicode数据,非编码数据。您只需要解码
图形名
,而不是将其再次编码为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控制台打印非常困难,请参阅

不幸的是,Windows上的
sys.argv显然会被乱码,因为Python使用了一个不支持unicode的系统调用。有关支持unicode的替代方案,请参阅


我看不出
argparse
有任何Unicode输入问题的原因,但如果有问题,您可以始终从
win32\u Unicode\u argv()
获取Unicode输出,并将其编码到UTF-8,然后将其传递到
argparse

打印报告(ORH)
给我
u'\u0440\u0430\u0437\u044a\u0435\u0434\u0430\u044e\u0442'
,和
打印报告(字形)
给我
打印报告(ORH)
给我
u'\u0440\u0430\u0437\u044a\u0435\u0434\u0430\u044e\u0442'
,和
打印报告(字形)
给了我
“?”
谢谢你的回复。我刚刚试过(只是解码),但除了
打印报告(grapheme)
现在给我
u'?'
@KaleidoEscape:这是一个ascii问号;这就是传入的内容,或者您使用
.decode(sys.stdin.encoding,'replace')
忽略未知字符。
repr(sys.argv)
告诉您传入的Windows是什么?
打印sys.stdin.encoding
告诉您什么是预期的编解码器?我没有使用
.decode(sys.stdin.encoding,'replace')
,至少是有意识地,呵呵。我正在使用
argparse
模块,也许它会这样做
'repr(sys.argv)
告诉我
['myscript.py'、'test.txt'、'-graph'、'?']
print sys.stdin.encoding
cp437
(当然,我在运行脚本时没有键入问号,我键入了ъKaleidoEscape:然后windows将
'?
作为参数传入,我很害怕。@KaleidoEscape:看看有什么解决办法。谢谢你的回复。我刚刚试过(只是解码),但除了
打印报告(grapheme)
现在给我
u'?'
@KaleidoEscape:这是一个ascii问号;这就是传入的内容,或者您使用
.decode(sys.stdin.encoding,'replace')
忽略未知字符。
repr(sys.argv)
告诉您传入的Windows是什么?
打印sys.stdin.encoding
告诉您什么是预期的编解码器?我没有使用
.decode(sys.stdin.encoding,'replace')
,至少是有意识地,呵呵。我正在使用
argparse
模块,也许它会这样做
'repr(sys.argv)
告诉我
['myscript.py'、'test.txt'、'-graph'、'?']
print sys.stdin.encoding
cp437
(当然,我在运行脚本时没有键入问号,我键入了ъ)。@KaleidoEscape:然后windows作为参数传入了
'
。@KaleidoE