如何告诉 Python sys.argv 是 Unicode 格式?

发布于 2024-10-19 10:10:58 字数 625 浏览 2 评论 0原文

这是一个小程序:

import sys

f = sys.argv[1]
print type(f)
print u"f=%s" % (f)

这是我运行的程序:

$ python x.py 'Recent/רשימת משתתפים.LNK'
<type 'str'>
Traceback (most recent call last):
  File "x.py", line 5, in <module>
    print u"f=%s" % (f)
UnicodeDecodeError: 'ascii' codec can't decode byte 0xd7 in position 7: ordinal not in range(128)
$ 

问题是 sys.argv[1] 认为它正在获取一个 ascii 字符串,但无法将其转换为 Unicode。但我使用的是带有完整 Unicode 感知终端的 Mac,因此 x.py 实际上获取的是 Unicode 字符串。如何告诉 Python sys.argv[] 是 Unicode 而不是 Ascii?如果做不到这一点,我如何将 ASCII(其中包含 unicode)转换为 Unicode?明显的转换不起作用。

Here is a little program:

import sys

f = sys.argv[1]
print type(f)
print u"f=%s" % (f)

Here is my running of the program:

$ python x.py 'Recent/רשימת משתתפים.LNK'
<type 'str'>
Traceback (most recent call last):
  File "x.py", line 5, in <module>
    print u"f=%s" % (f)
UnicodeDecodeError: 'ascii' codec can't decode byte 0xd7 in position 7: ordinal not in range(128)
$ 

The problem is that sys.argv[1] is thinking that it's getting an ascii string, which it can't convert to Unicode. But I'm using a Mac with a full Unicode-aware Terminal, so x.py is actually getting a Unicode string. How do I tell Python that sys.argv[] is Unicode and not Ascii? Failing that, how do I convert ASCII (that has unicode inside it) into Unicode? The obvious conversions don't work.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

许你一世情深 2024-10-26 10:10:58

您看到的 UnicodeDecodeError 错误是由于您混合了 Unicode 字符串 u"f=%s"sys.argv[1] 字节串:

  • 两个字节串:

     $ python2 -c'import sys; print "f=%s" % (sys.argv[1],)' '最近/最近的时间'
    

    这会透明地将字节从您的终端传递到您的终端。它适用于任何编码。

  • 都是 Unicode:

     $ python2 -c'import sys; print u"f=%s" % (sys.argv[1].decode("utf-8"),)' '记录..
    

    在这里,您应该将 'utf-8' 替换为您的终端使用的编码。如果终端不支持 Unicode,您可以在此处使用 sys.getfilesystemencoding()。

两个命令产生相同的输出:

f=Recent/רשימת משתתפים

一般来说,您应该尽快将您认为是文本的字节串转换为 Unicode。

The UnicodeDecodeError error you see is due to you're mixing the Unicode string u"f=%s" and the sys.argv[1] bytestring:

  • both bytestrings:

      $ python2 -c'import sys; print "f=%s" % (sys.argv[1],)' 'Recent/רשימת משתתפים'
    

    This passes bytes transparently from/to your terminal. It works for any encoding.

  • both Unicode:

      $ python2 -c'import sys; print u"f=%s" % (sys.argv[1].decode("utf-8"),)' 'Rec..
    

    Here you should replace 'utf-8' by the encoding your terminal uses. You might use sys.getfilesystemencoding() here if the terminal is not Unicode-aware.

Both commands produce the same output:

f=Recent/רשימת משתתפים

In general you should convert bytestrings that you consider to be text to Unicode as soon as possible.

远昼 2024-10-26 10:10:58
sys.argv = map(lambda arg: arg.decode(sys.stdout.encoding), sys.argv)

或者您可以从 locale.getdefaultlocale()[1] 选择编码

sys.argv = map(lambda arg: arg.decode(sys.stdout.encoding), sys.argv)

or you can pick encoding from locale.getdefaultlocale()[1]

枕花眠 2024-10-26 10:10:58

命令行参数使用用于启动 Python 的 shell 上使用的编码作为字节字符串传递到 Python 中。因此,除了在应用程序内将参数您自己转换为 unicode 之外,没有其他方法可以将命令行参数作为 unicode 字符串传递到 Python 中。

Command line parameters are passed into Python as byte string using the encoding as used on the shell used for started Python. So there is no way for having commandline parameters passed into Python as unicode string other than converting parameters yourself to unicode inside your application.

时光暖心i 2024-10-26 10:10:58

尝试:

f = sys.argv[1].decode('utf-8')

或:

f = unicode(sys.argv[1], 'utf-8')

try either:

f = sys.argv[1].decode('utf-8')

or:

f = unicode(sys.argv[1], 'utf-8')
疧_╮線 2024-10-26 10:10:58
  1. sys.argv 从来都不是“Unicode 格式”;它肯定是经过编码的,但 Unicode 不是一种编码,而是一组代码点(数字),其中每个数字唯一地代表一个字符。 http://www.unicode.org/standard/WhatIsUnicode.html

  2. 转到到 Terminal.app >终端>首选项>设置>字符编码,然后从下拉列表中选择 UTF-8。

  3. 此外,Mac OS X 附带的默认 Python 在 Unicode 方面存在一个缺陷:它默认使用已弃用的 UCS-2 构建;请参阅:http://webamused.wordpress.com/2011/01/31/building-64-bit-python-python-org-using-ucs-4- on-mac-os-x-10-6-6-snow-leopard/

  1. sys.argv is never "in Unicode"; it's encoded for sure, but Unicode is not an encoding, rather it is a set of code points (numbers), where each number uniquely represents a character. http://www.unicode.org/standard/WhatIsUnicode.html

  2. Go to Terminal.app > Terminal > Preferences > Settings > Character encoding, and select UTF-8 from the drop-down list.

  3. Also, the default Python that ships with Mac OS X has one flaw with regards to Unicode: its built using the deprecated UCS-2 by default; see: http://webamused.wordpress.com/2011/01/31/building-64-bit-python-python-org-using-ucs-4-on-mac-os-x-10-6-6-snow-leopard/

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文