【问题标题】:Replace in a string with unicode Django and python3.7用 unicode Django 和 python3.7 替换字符串
【发布时间】:2019-05-18 01:40:18
【问题描述】:

所以我在 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()

我想更正导入文件的错误,并清理数据库。 我想用“Ecoles”替换“Ã%Coles”。

但输出是:

Rue Des Ã%Coles
Rue Des Ã%Coles

如何清理这个?我想用“Ecoles”替换“Ã%Coles”

【问题讨论】:

  • 在前后输入print(repr(rue.name.encode('latin-1'))。这可能会准确说明您在字符串中的内容。我本来希望输出 'Rue Des \xc3\x89coles' 而不是你所说的 'Rue Des \xc3%Coles' 如果它无意中解码了 latin-1 而不是 utf-8 解码(这似乎是一个可能的原因)。
  • html 文档是否使用 latin-1 而不是 utf-8?检查是否有元标记<meta charset="utf-8">
  • 如果您的数据已经以错误的编码保存在数据库中,这个库可以帮助您再次清理它。 ftfy.readthedocs.io/en/latest

标签: django python-3.x unicode


【解决方案1】:

这看起来像是损坏的编码,并且您看到的 %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,非打印字符和无效代码点将显示为Unicode转义码print(repr('Écoles'.encode('utf-8').decode('iso-8859-1'))) => 'Ã\x89coles'\x89 代码点在 unicode 中未使用,在 latin-1 / iso-8859-1 中也未使用。
猜你喜欢
  • 2013-06-25
  • 1970-01-01
  • 2021-06-30
  • 2018-07-02
  • 2019-01-24
  • 2014-12-03
  • 1970-01-01
  • 2018-04-19
  • 2011-04-26
相关资源
最近更新 更多