UTF-8, декодирующий файл в кодировке ANSI, выдает ошибку - PullRequest
0 голосов
/ 04 июня 2019

Вот кое-что, что я пытаюсь понять. У меня сложилось впечатление, что UTF-8 обладает обратной совместимостью, поэтому я могу всегда декодировать текстовый файл с помощью UTF-8, даже если это файл ANSI. Но, похоже, это не так:

In [1]: ansi_str = 'éµaØc'

In [2]: with open('test.txt', 'w', encoding='ansi') as f:
   ...:     f.write(ansi_str)
   ...:

In [3]: with open('test.txt', 'r', encoding='utf-8') as f:
   ...:     print(f.read())
   ...:
---------------------------------------------------------------------------
UnicodeDecodeError                        Traceback (most recent call last)
<ipython-input-3-b0711b7b947e> in <module>
      1 with open('test.txt', 'r', encoding='utf-8') as f:
----> 2     print(f.read())
      3

c:\program files\python37\lib\codecs.py in decode(self, input, final)
    320         # decode input (taking the buffer into account)
    321         data = self.buffer + input
--> 322         (result, consumed) = self._buffer_decode(data, self.errors, final)
    323         # keep undecoded input until the next call
    324         self.buffer = data[consumed:]

UnicodeDecodeError: 'utf-8' codec can't decode bytes in position 0-1: invalid continuation byte

Таким образом, похоже, что мой код ожидает UTF-8 и может встретиться с файлом в кодировке ANSI, мне нужно обработать UnicodeDecodeError. Это хорошо, но я был бы признателен, если бы кто-нибудь смог пролить свет на мое первоначальное недоразумение.

Спасибо!

1 Ответ

1 голос
/ 04 июня 2019

UTF-8 обратно совместим с ASCII . Не ANSI. «ANSI» даже не описывает какую-либо конкретную кодировку . И те символы, с которыми вы тестируете, находятся за пределами диапазона ASCII, поэтому, если вы на самом деле не закодируете их с помощью UTF-8, вы не сможете прочитать их как UTF-8.

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