Python:lower()函数与德语Umlauts

8

我在将带有umlauts的大写字母转换为小写字母时遇到了问题。

print("ÄÖÜAOU".lower())

字母A、O和U被正确转换,但Ä、Ö和Ü保持大写。有什么想法吗?

第一个问题已通过.decode('utf-8')解决,但我仍然有第二个问题:

# -*- coding: utf-8 -*-
original_message="ÄÜ".decode('utf-8')
original_message=original_message.lower()
original_message=original_message.replace("ä", "x")
print(original_message)

错误回溯(Traceback)如下所示: 在文件 "Untitled.py" 的第4行,出现了以下错误:original_message=original_message.replace("ä", "x") UnicodeDecodeError: 'ascii' 编解码器无法解码第0个位置上的字节(byte 0xc3),因为其编码值不在128范围内。


3
你使用的是Python 2还是3? - Martijn Pieters
Python 2.7.2 是随 OSX 发送的版本。 - user2104634
4
那就是你的问题所在。 - Oleh Prypin
3个回答

9

如果您正在处理纯ASCII文本以外的内容,您需要将其标记为Unicode字符串。

> print(u"ÄÖÜAOU".lower())

äöüaou

当处理变量时,它的工作方式相同,这完全取决于最初分配给变量的类型。

> olle = "ÅÄÖABC"
> print(olle.lower())
ÅÄÖabc

> olle = u"ÅÄÖABC"
> print(olle.lower())
åäöabc

@user2104634 上述示例在Mac OS X上的标准Python 2.7.2上运行。如果不标记为Unicode,它只会将ASCII字符转换为小写字母;使用u标记,它会给出正确的输出。 - Joachim Isaksson
1
正如Matthias所说,编码元数据只是帮助Python正确检测文件编码的,与运行时的ASCII和Unicode字符串无关。 - Joachim Isaksson
如果 original_message 包含 Unicode 字符串,那么它将正常工作。在答案中添加了一个示例。 - Joachim Isaksson
问题在于变量来自于一个 raw_input。 - user2104634
它能正常工作,直到脚本遇到应该替换字符的点。 - user2104634
显示剩余7条评论

3
您正在处理编码字符串,而不是Unicode文本。字节字符串的 .lower() 方法只能处理ASCII值。将您的字符串解码为Unicode或使用 unicode 字面量 (u''),然后转换为小写。
>>> print u"\xc4AOU".lower()
äaou

@user2104634: 你需要阅读 Python Unicode HOWTO;你需要将变量解码为 unicode 值(variable.decode(encoding'))。 - Martijn Pieters

2

如果您正在使用Python 2,但不想在所有字符串前加上u"",请在程序开头添加以下内容:

from __future__ import unicode_literals
olle = "ÅÄÖABC"
print(olle.lower())

现在将返回:
åäöabc

编码指定如何将从磁盘读取的字符解释为程序,但 from __future__ import 语句告诉程序如何解释这些字符串。你可能需要同时使用两者。

今天,我的建议是——使用Python 3。unicode_literals在许多地方都无法正常工作,因此不值得使用。 - Michael Scott Asato Cuthbert

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接