如何在Python中查找和替换UTF-8特殊字符?

jvlzgdj9  于 2023-02-15  发布在  Python
关注(0)|答案(4)|浏览(182)

我是一个Python初学者,我有一个utf-8问题。
我有一个utf-8字符串,我想用ASCII替换所有德语元音变音(在德语中,u-umlaut 'ü'可以重写为'ue')。
u-umlaut有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。)

watbbzwu

watbbzwu1#

我会定义一个特殊字符的字典(我想Map),然后使用translate方法。

line = 'Ich möchte die Qualität des Produkts überprüfen, bevor ich es kaufe.'

special_char_map = {ord('ä'):'ae', ord('ü'):'ue', ord('ö'):'oe', ord('ß'):'ss'}
print(line.translate(special_char_map))

您将获得以下结果:

Ich moechte die Qualitaet des Produkts ueberpruefen, bevor ich es kaufe.
nxagd54h

nxagd54h2#

我认为用一种更直接的方式来做是最简单和清楚的,直接使用unicode表示os 'ü'比unichr(252)更好。

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

不需要使用repr,因为这将打印字符串的“Python表示”,您只需要显示可读的字符串。
您还需要在.py文件的开头包含以下行,以防它不存在,以告知文件的编码

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

**添加:**当然,声明的编码必须与文件的编码相同。请检查这一点,因为可能存在一些问题(例如,我在Windows上使用Eclipse时遇到问题,因为它默认将文件写入cp 1252。此外,它应该与系统的编码相同,可能是utf-8或latin-1或其他。

另外,不要使用str作为变量的定义,因为它是Python库的一部分,以后可能会出现问题。
(我正在Python 2.6上尝试,我认为在Python 2.3中结果是相同的)

u1ehiz5o

u1ehiz5o3#

repr(str)返回一个带引号的str,当打印出来的时候,你可以用Python的方式重新输入,得到这个字符串,它是一个包含\xfcber的字符串,而不是一个包含über的字符串。
您可以使用str.replace(unichr(252), 'ue')ü替换为ue
如果你需要得到一个带引号的结果,尽管我认为你不需要它,你可以把整个表达式 Package 在repr中:

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

kx7yvsdv4#

你可以避免所有源文件编码的东西和它的问题。使用Unicode名称,那么你正在做的事情就会非常明显,代码可以在任何地方阅读和修改。
我不知道有哪种语言的唯一重音拉丁字母是小写字母u和元音变音符号aka分音符,所以我添加了代码,在假设您需要它的情况下循环遍历一个翻译表。

# 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

相关问题