2010-01-13 87 views
4

我是一个Python初学者,我有一个utf-8的问题。如何在Python中搜索和替换utf-8特殊字符?

我有一个utf-8字符串,我想用ASCII替换替换所有德语元音变音(在德语中,u变音符'ü'可能会被重写为'ue')。

U型变音符号有Unicode代码点252,所以我想这:

>>> str = unichr(252) + 'ber' 
>>> print repr(str) 
u'\xfcber' 
>>> print repr(str).replace(unichr(252), 'ue') 
u'\xfcber' 

我希望最后一个字符串为u'ueber'

我最终想要做的就是用“UE”代替所有的u-变音符号的文件:

import sys 
import codecs  
f = codecs.open(sys.argv[1],encoding='utf-8') 
for line in f: 
    print repr(line).replace(unichr(252), 'ue') 

感谢您的帮助! (我正在使用Python 2.3。)

+2

注意,Unicode标准还定义了精梳字符。因此ü也可以用unicode序列表示U + 0075 U + 0308 – elmuerte 2010-01-13 08:02:00

回答

8

repr(str)返回一个带引号的版本str,打印出来后,将会以Python的形式重新输入以获取字符串。所以,这是一个字符串,它包含\xfcber,而不是包含über的字符串。

您可以使用str.replace(unichr(252), 'ue')来替换üue

如果你需要得到这个结果的引用版本,但我不认为你需要它,你可以用整个表达式中repr

repr(str.replace(unichr(252), 'ue')) 
7

我认为这是最简单,更清楚地以更直接的方式进行,直接使用unicode表示os'ü'比unichr(252)更好。

>>> s = u'über' 
>>> s.replace(u'ü', 'ue') 
u'ueber' 

有没有必要使用再版,因为这将打印字符串“Python的表现”,你只需要出示可读的字符串。

,您还需要包括在.py文件的beggining以下行,如果它不存在,说文件

#-*- coding: UTF-8 -*- 

新增的编码:当然,声明的编码必须与文件的编码相同。请检查一下是否有问题(例如,我在Windows上使用Eclipse时遇到了问题,例如,它默认将文件写入为cp1252。此外,它应该与系统的编码相同,可以是utf-8或拉丁文-1或他人。


另外,不要使用str作为变量的定义,因为它是Python库的一部分。你以后可能会出现问题。

(我想上Python 2.6,我认为在Python 2.3中结果是一样的)

+0

重要的一点:实际上将源文件保存在编码声明中声明的编码中。很多人都忘记了。 – 2010-01-13 07:14:02

+0

您必须实际上能够将其编辑为UTF-8。例如,如果整个系统设置为Latin-1,则无论文件中的编码声明如何,它都不起作用。这意味着如果你不能保证UTF-8的使用,使用unichr的原始方式会更好。 – 2010-01-13 07:29:31

+0

我已经添加了一些信息,由于评论。 @ mark:好的一点,出于这个原因,我在Eclipse上遇到了一些问题。 @jae我认为最好的方法是声明一致的编码,然后声明该字符为u'ü'。将它声明为unicode数字在代码中似乎很混乱。我同意在奇怪的情况下可能是不可避免的,但根据我的经验,通常很容易使用正确的编码。 – Khelben 2010-01-13 07:53:45

5

你可以避免所有的sourcefile编码的东西及其问题,使用Unicode名称th它尖锐地显示你在做什么,并且可以在任何地方读取和修改代码。

我不知道任何语言,只有重音的拉丁字母是小写字母u-a-umlaut-aka-diaeresis,所以我添加了代码来循环翻译表格,你需要它。

# coding: ascii 

translations = (
    (u'\N{LATIN SMALL LETTER U WITH DIAERESIS}', u'ue'), 
    (u'\N{LATIN SMALL LETTER O WITH DIAERESIS}', u'oe'), 
    # et cetera 
    ) 

test = u'M\N{LATIN SMALL LETTER O WITH DIAERESIS}ller von M\N{LATIN SMALL LETTER U WITH DIAERESIS}nchen' 

out = test 
for from_str, to_str in translations: 
    out = out.replace(from_str, to_str) 
print out 

输出:

Moeller von Muenchen