【问题标题】:Easiest way to enumerate utf-8 string枚举 utf-8 字符串的最简单方法
【发布时间】:2012-03-27 04:28:40
【问题描述】:

我阅读了很多链接和建议,毕竟当我需要在 Python 中操作不是 ASCII 字符的字符串时,我更加困惑。

我在 Ubuntu 上使用 Python 2.7:

#!/usr/bin/python
# -*- coding: utf-8 -*-

for i, j in enumerate('Сон'): print '%d: %s' % (i+1, j)

输出:

1: Ð
2: ¡
3: Ð
4: ¾
5: Ð
6: ½

我获得 3 个 UTF-8 编码字符而不是 6 个字节字符的最简单方法是什么?

【问题讨论】:

标签: python utf-8


【解决方案1】:

简单的答案:don't

>>> len(u'Сон')
3

【讨论】:

  • 我之前浏览过 - 早解码,后编码。没听懂,希望 Python 3 能早点到来
  • @theta 嗯? Python 3.0 于 2008 年 12 月发布。
  • 你最喜欢的 Python 包是否支持它,或者你的系统将它设置为默认解释器:D
【解决方案2】:

如果您希望输出 utf-8 字符,您还需要确保 Python 知道要使用哪种编码

$ export PYTHONIOENCODING=ascii
$ python
Python 2.7.1+ (r271:86832, Apr 11 2011, 18:05:24) 
[GCC 4.5.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> sys.stdout.encoding
'ascii'
>>> for i, j in enumerate(u'Сон'): print '%d: %s' % (i+1, j)
... 
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode character u'\u0421' in position 3: ordinal not in range(128)

$ export PYTHONIOENCODING=utf-8
$ python
Python 2.7.1+ (r271:86832, Apr 11 2011, 18:05:24) 
[GCC 4.5.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> sys.stdout.encoding
'utf-8'
>>> for i, j in enumerate(u'Сон'): print '%d: %s' % (i+1, j)
... 
1: С
2: о
3: н
>>> 

【讨论】:

  • 谢谢,上面提到的问题是我的编辑。它的输出窗格可能是 ascii,但如果您熟悉 SciTE,我将其设置为 output.code.page=65001
【解决方案3】:
# -*- coding: utf-8 -*-
for i, j in enumerate(u'Сон'):
    print '%d: %s' % (i+1, j)

关于 Python 中的源代码编码:http://www.python.org/dev/peps/pep-0263/

字符串前的'u'前缀表示将使用unicode字符串。

【讨论】:

    【解决方案4】:

    在它前面添加一个'u'来指定它是unicode:

    for i, j in enumerate(u'Сон'): print '%d: %s' % (i+1, j)
    

    输出

    1: С
    2: о
    3: н
    

    【讨论】:

    • @theta,sys.stdout.encoding 说什么?
    • 我已经尝试过了,现在因为我得到了两个相似的答案并检查了更多 - 问题出在我的编辑器 - SciTE 和它的输出窗格。在终端中,您的建议工作正常,在 SciTE(我工作得最多)中,我得到 UnicodeDecodeError。将进一步调查
    猜你喜欢
    • 2011-04-28
    • 2012-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-11
    • 1970-01-01
    • 2011-08-09
    • 2010-09-13
    相关资源
    最近更新 更多