Повідомлення про помилку вказує вам саме те, що не так. Інтерпретатору Python необхідно знати кодування символу, що не належить до ASCII.
Якщо ви хочете повернути U + 00A3, то можете сказати
return u'\u00a3'
який представляє цей символ у чистому ASCII за допомогою послідовності відходу Unicode. Якщо ви хочете повернути рядок байтів, що містить буквальний байт 0xA3, це
return b'\xa3'
(де в Python 2 значення b
неявне, але явне краще, ніж неявне).
Зв'язаний PEP у повідомленні про помилку вказує вам , як саме сказати Python "цей файл не є чистим ASCII; ось кодування, яке я використовую". Якщо кодування UTF-8, це було б
# coding=utf-8
або сумісні з Emacs
# -*- encoding: utf-8 -*-
Якщо ви не знаєте, яке кодування ваш редактор використовує для збереження цього файлу, вивчіть його за допомогою чогось шестигранного редактора та якогось googling. Переповнення стекакодування символівТег має сторінку з інформацією про теги з додатковою інформацією та деякими порадами щодо усунення несправностей.
У так багато слів, поза межами 7-бітового діапазону ASCII (0x00-0x7F), Python не може і не повинен здогадуватися, що представляє собою послідовність байтів. https://tripleee.github.io/8bit#a3 показує 21 можливу інтерпретацію байта 0xA3, і це лише зі застарілих 8-бітових кодувань; але це також може бути першим байтом багатобайтового кодування. Але насправді я б здогадався, що ти насправді використовуєш латинську-1, тож маєш мати
# coding: latin-1
як перший чи другий рядок вашого вихідного файлу. У будь-якому випадку, без знання того, якого символу байт повинен представляти, людина теж не змогла б здогадатися про це.
Застереження: coding: latin-1
обов'язково видалить повідомлення про помилку (оскільки немає послідовностей байтів, які технічно не дозволено в цьому кодуванні), але вони можуть призвести до зовсім неправильного результату, коли код інтерпретується, якщо фактичне кодування є чимось іншим. Ви справді повинні знати кодування файлу з повною визначеністю, коли ви заявляєте про кодування.