Вам необходимо удалить вызов на encode()
, то есть заменить nodeValue.encode("utf-8")
на nodeValue
, а затем изменить вызов на open()
на
with open("uiStrings-fi.py", "w", "utf-8") as f:
. При этом используетсяВерсия open()
с поддержкой Unicode, которую вам нужно будет импортировать из модуля codecs
, поэтому также добавьте
from codecs import open
в начало файла.
Проблемав том, что когда вы вызывали nodeValue.encode("utf-8")
, вы конвертировали строку Unicode (внутреннее представление Python, которое может хранить все символы Unicode) в обычную строку (которая может хранить только однобайтовые символы 0-255).Позже, когда вы создаете строку для записи в выходной файл, names[i]
все еще является строкой Unicode, но values[i]
является обычной строкой.Python пытается преобразовать обычную строку в Unicode, который является более общим типом, но поскольку вы не указываете явное преобразование, он использует кодек ASCII, который является значением по умолчанию, и ASCII не может обрабатывать символы с байтовыми значениями большечем 127. К сожалению, некоторые из них встречаются в строке values[i]
, потому что кодировка UTF-8 часто использует эти байты верхнего диапазона.Поэтому Python жалуется, что видит персонажа, с которым не может справиться.Решение, как я уже говорил выше, состоит в том, чтобы отложить преобразование из Unicode в байты до последнего возможного момента, и вы делаете это с помощью версии open с поддержкой Unicode (которая будет обрабатывать кодировку для вас).
Теперь, когда я думаю об этом, вместо того, что я сказал выше, альтернативным решением было бы заменить names[i]
на names[i].encode("utf-8")
.Таким образом, вы также преобразуете names[i]
в обычную строку, и у Python нет причин пытаться преобразовать values[i]
обратно в Unicode.Хотя можно утверждать, что хорошей практикой является сохранение ваших строк в качестве объектов Юникода до тех пор, пока вы не запишите их в файл ... если ничего больше, я считаю, что unicode
становится значением по умолчанию в Python 3.