将所有Unicode字符视为单个字母

时间:2015-12-17 17:37:00

标签: python python-2.7

我想创建一个程序,通过根据单词在单词中的第一个位置添加给它的字母来计算单词的“值”(作为练习,我是Python的新手)。
IE浏览器。 "foo"将返回5(因为'f'= 1,'o'= 2)而"bar"将返回6(因为'b'= 1,'a'= 2,'r'= 3 )。

到目前为止,这是我的代码:

# -*- coding: utf-8 -*-
 def ppn(word):
    word = list(word)
    cipher = dict()
    i = 1
    e = 0

    for letter in word:
        if letter not in cipher:
            cipher[letter] = i
            e += i
            i += 1
        else:
            e += cipher[letter]
    return ''.join(word) + ": " + str(e)


if __name__ == "__main__":
    print ppn(str(raw_input()))

它运行良好,但对于包含'ł','±'等字符的单词,它不会返回正确的值(我猜它是因为它首先将这些字母转换为Unicode代码)。有没有办法绕过它并让翻译人员将所有字母视为单个字母?

3 个答案:

答案 0 :(得分:2)

将输入解码为unicode,然后在任何地方使用unicode,然后在输出时解码。

具体而言,您需要更改

print ppn(str(raw_input()))

print ppn(raw_input().decode(sys.stdin.encoding))

这将解码您的输入。然后你还需要改变

''.join(word) + ": " + str(e)

u''.join(word) + u': ' + unicode(e)

这使得所有代码都在内部使用unicode对象。

打印会将unicode正确编码为终端正在使用的编码,但如果需要,也可以指定。

或者你可以完全按照你已经拥有的那样做,但是用python 3运行它。

有关详细信息,请阅读此非常有用的talk on the subject

答案 1 :(得分:2)

使用shell的编码进行解码:

if __name__ == "__main__":
    import sys
    print ppn((raw_input()).decode(sys.stdin.encoding))

对于Unix系统,通常UTF-8有效。在Windows上,事情可能会有所不同。要保存使用sys.stdin.encoding。你永远不知道你的脚本将在哪里运行。

或者,甚至更好。切换到Python 3:

# -*- coding: utf-8 -*-

import sys

assert sys.version_info.major > 2


def ppn(word):
    word = list(word)
    cipher = dict()
    i = 1
    e = 0

    for letter in word:
        if letter not in cipher:
            cipher[letter] = i
            e += i
            i += 1
        else:
            e += cipher[letter]
    return ''.join(word) + ": " + str(e)

if __name__ == "__main__":
    print(ppn(str(input())))

在Python 3中,默认情况下字符串是unicode。所以不需要解码业务。

答案 2 :(得分:2)

到目前为止,所有的答案都解释了该怎么做,但没有说明发生了什么,所以这里有一些提示。

当您在Python 2中使用raw_input()时,会返回一个字节字符串(Python 3上的input()表现不同)。大多数unicode字符不能表示为单个字节,因为unicode字符多于可用字节表示的值。

łą等字符,当使用utf-8或其他编码进行编码时,可能需要两个字节或更多字节:

>>> 'ł'
'\xc5\x82'
>>> 'ą'
'\xc4\x85'

您的原始程序将这两个字节解释为不同的字符,从而导致错误的结果。

Python提供了字节字符串的替代方法:unicode字符串。使用unicode字符串时,一个字符恰好显示为一个字符(字符串的内部表示形式是不透明的),并且您遇到的问题不会发生。

因此,将bytestring解码为unicode字符串是可行的方法。