Итак, у меня есть это поле ввода в Django:
class Rue(models.Model):
created = models.DateTimeField(null=True, blank=True, editable=False)
modified = models.DateTimeField(null=True, blank=True)
name = models.CharField(blank=True, null=True, max_length=200)
Вот мой сценарий:
print(rue.name)
rue.name = rue.name.replace("Ã%Coles","Ecoles")
print(rue.name)
rue.save()
Я хочу исправить ошибку импортированного файла и очистить базу данных. Я хотел бы заменить «Ã% Coles» на «Ecoles».
Но на выходе получается:
Rue Des Ã%Coles
Rue Des Ã%Coles
Как это почистить? я хочу заменить "Ã% Coles" на "Ecoles"
Использует ли html-документ latin-1 вместо utf-8? Проверьте, есть ли метатег <meta charset = "utf-8">
Если ваши данные были сохранены в базе данных с неправильной кодировкой, эта библиотека может помочь вам снова очистить их. ftfy.readthedocs.io/en/latest
Это похоже на нарушенную кодировку, и %C
, который вы видите, - это не процент, за которым следует C, а вместо этого один единственный управляющий символ, который, вероятно, был изменен в дальнейшем.
в моей системе:
>>> print('Écoles'.encode('utf-8').decode('iso-8859-1'))
à coles
Чтобы решить эту единственную проблему, вы, вероятно, могли бы сделать:
broken_e = 'É'.encode('utf-8').decode('iso-8859-1')
rue.name = rue.name.replace(broken_e, 'E')
rue.save()
Если вы добавите туда repr
, непечатаемые символы и недопустимые кодовые точки будут отображаться как escape-коды Unicode print(repr('Écoles'.encode('utf-8').decode('iso-8859-1')))
=> 'Ã\x89coles'
. Кодовая точка \x89
не используется в юникоде, а также в latin-1 / iso-8859-1.
Введите
print(repr(rue.name.encode('latin-1'))
до и после. Это может прояснить, что именно у вас в строке. Я ожидал, что выведет 'Rue Des \ xc3 \ x89coles', а не 'Rue Des \ xc3% Coles', как вы говорите, если он был случайно декодирован latin-1 вместо декодирования utf-8 (что кажется вероятной причиной ).