Трудности кодирования Python - PullRequest
0 голосов
/ 24 апреля 2018

Моя программа такова, что она принимает строку, а затем пытается записать эту строку в файл.Я думаю, что проблема в том, что строка имеет специальные символы (ü, ç и т. Д.).

Когда я пытаюсь просто записать строку в файл, я получаю ошибку компилятора (или что-то подобное):

UnicodeEncodeError: 'charmap' codec cannot encode character '\u200b' in position 16: character maps to <undefined>

Итак, я написал функцию, которая выглядит следующим образом:

def try_encode(info):
    if info is None:
        return None
temp = (str(info.encode('utf-8'))).replace("\n","")
return '"' + temp[2:len(temp)-1] + '"'

(я хочу избавиться от всех новых строк и написать строку, заключенную в кавычки)

Но проблема, возникающая при запуске, заключается в том, что после запуска программы открываемый файл содержит несколько странных символов, которые начинаются с: \x

Некоторые примеры этих символов:

\xc3, \xa9p, \xaa, \xe2, \x80, etc

Я думаю, что они соответствуют специальным символам, которые я упомянул выше.Я экспериментировал с разными кодировками (utf-16 и utf-7), но все они либо не помогают, либо делают эти символы более распространенными.Может кто-нибудь помочь мне понять, как избавиться от них?

РЕДАКТИРОВАТЬ: в том числе код, где я открываю файл:

f = open(filename, "w")

1 Ответ

0 голосов
/ 25 апреля 2018

Вы делаете вещь в неправильном порядке.

Есть строки, и есть двоичное представление этих строк (также известное как кодировка . Нужно работать со строками, и как раз во время записи (и чтения) нужно конвертировать двоичный файл (закодированный) текст в текст Unicode (аннотация, игнорировать внутреннее представление строк в языке Python).

Ваш str(info.encode('utf-8')) не имеет особого смысла: вы говорите python кодировать информацию в UTF-8, а затем снова декодировать ее с помощью UTF-8 (по умолчанию encoding из str).

replace, and the addition of quotes should apply just to strings. So your functions never do what the name imply " try_encode` ": ничего не кодируется.

Так что эта проблема не только в этой (сломанной) функции, но в том, как вы сохраняете / печатаете строки Python. В Unix / Linux / MacO у вас по умолчанию UTF-8, но я ожидаю, что вы находитесь в Windows, и там нет реального значения по умолчанию (это зависит от локальной конфигурации). Поэтому вам следует явно указать, какую кодировку вы используете (например, с помощью open (добавление параметра, например, encoding='utf-8') [В Windows это практически обязательно, но лучше быть явным и не полагаться на неявное соглашение также в других операционных системах)]

Для print все более сложно, потому что не следует выбирать кодировку, а терминал / консоль должен давать программе то, что кодировка консоли поддерживает (и может печатать). Так что в этом случае неизбежно, что некоторые символы будут экранированы (терминал не поддерживает полный Unicode). Вы можете изменить настройки консоли.

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