Почему 'кодирование ("utf-8", "игнорирование"). Decode ("utf-8") "не обрабатывает символы не UTF8 в Python 3? - PullRequest
0 голосов
/ 19 февраля 2020

Я использую Python 3,7 и Django 2,0. Я хочу вырезать символы не-UTF-8 из строки, которую я получаю, читая этот CSV-файл. Я пробовал это ...

web_site = row['website'].strip().encode("utf-8", 'ignore').decode("utf-8")

, но это, похоже, не делает работу, так как у меня есть результирующая строка, которая выглядит как ...

web_site: "wbez.org<200e>"

Независимо от этого «<200e>», очевидно, не является строкой UTF-8, потому что, когда я пытаюсь вставить ее в базу данных MySQL (развернутую как образ docker), я получаю следующую ошибку ...

web_1     | django.db.utils.OperationalError: Problem installing fixture '/app/maps/fixtures/seed_data.yaml': Could not load maps.Coop(pk=191): (1366, "Incorrect string value: '\\xE2\\x80\\x8E' for column 'web_site' at row 1")

Ответы [ 2 ]

1 голос
/ 20 февраля 2020

Ваш row['website'] уже является строкой Unicode. UTF-8 может поддерживать все допустимые кодовые точки Unicode, поэтому .encode('utf8','ignore') обычно ничего не игнорирует и кодирует всю строку в UTF-8, а .decode('utf8') снова меняет ее на строку Unicode.

Если вы просто хотите удалить символы, не входящие в ASCII, используйте следующую команду, чтобы отфильтровать только символы ASCII и игнорировать остальные.

row['website'].encode('ascii','ignore').decode('ascii')
0 голосов
/ 19 февраля 2020

Я думаю, что вы путаете кодировки.

  • Python имеет стандартный набор символов: Unicode

  • UTF-8 просто и кодировка Unicode. Все символы в Unicode могут быть закодированы в UTF-8, и все действительные коды UTF-8 могут быть интерпретированы как символы Unicode.

Таким образом, вы просто кодируете и декодируете строки Unicode, поэтому код ничего не должен делать (На самом деле есть некоторые исключительные случаи: Python строки действительно являются надмножеством Unicode, поэтому ваш код просто удалит не символы Unicode, см. surrogateescape, для такого крайне редкого случая, обычно вы включаете только чтение sys.argv или os.environ).

В любом случае, я думаю, что вы делаете что-то не так. Поищите на этом сайте общий вопрос (например, «удалить не-ascii символы»). Часто лучше разложить (с помощью K, совместимость), а затем удалить ударение, а затем удалить не-ascii символы, чтобы получить больше переведенных символов. Существуют различные функции для создания slug , которые работают лучше, или есть также библиотека, которая переводит больше символов в «почти эквивалентные» символы ascii (Unicode имеет различное представление LETTER A, и вы можете захотеть перевести также Alpha и Aleph и ... в A (лучше, чем отказываться, особенно если у вас есть иностранный язык, который, возможно, вы все выбросите).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...