Является ли Python 2.7 на самом деле преобразованием моей строки в UTF-8 или определение isalnum () различно на разных машинах? - PullRequest
0 голосов
/ 12 октября 2018

Мой sample.txt:

é Roméo et Juliette vécu heureux chaque après

Моя программа:

#!/usr/bin/env python2.7
# -*- coding: utf-8 -*-

with open("test4", "r") as f:
        s = f.read()
        print(s)
        print(isinstance(s, unicode))
        print(s[0].isalnum())

Мой вывод:

é Roméo et Juliette vécu heureux chaque après

False
False

От Python isalpha () иscandics и Как проверить, является ли строка юникодом или ascii? заставляет меня поверить, что оба утверждения должны быть верными.

Мои гипотезы:

  1. Emacs использует "iso-latin-1" в качестве кодировки файла, что портит вещи

  2. isalnum () зависит не от кодировки

  3. Строка 2 не работает

Больше всего меня беспокоит # 2.Меня не очень волнует результат isalnum (), я просто хочу, чтобы результат был согласованным для разных машин / людей.В худшем случае я могу просто бросить свой собственный isalnum ();но мне любопытно, почему я в первую очередь испытываю такое поведение.

Кроме того, я хочу быть уверенным, что моя программа также понимает документы в кодировке UTF-8 на разных машинах.

Любые идеичто происходит?

1 Ответ

0 голосов
/ 12 октября 2018

Строки (тип str) в Python 2.7 являются байтами.Когда вы читаете текст из файла, вы получаете байты, возможно, с окончаниями строк.Следовательно, s не является экземпляром типа unicode.

. На str тесты, подобные isalnum(), предполагают, что строка является текстом ASCII.ASCII определен только для кодов от 0 до 127. Python не имеет представления и не может знать, какие символы представлены значениями вне этого диапазона, поскольку кодировка неизвестна.é не является символом ASCII и поэтому не считается буквенно-цифровым.

То, что вы хотите сделать, - это декодировать прочитанную вами строку байта в строку Unicode:

u = s.decode("utf8")

(при условии, что строка записана в файл в кодировке UTF8, если это не сработает, вы можете попробовать latin1 или cp437 ... последнее - это то, что мой терминал дает мне в Windows 10)

Когда вы это сделаете, u[0].isalnum() будет True, а isinstance(u, unicode) также True.

Python 3 работает немного по-другому.Вы должны указать Python, какую кодировку использовать при открытии файла.Затем он переводит строки в Unicode из этой кодировки, когда вы их читаете.Все строки в Python 3 являются Unicode;есть отдельный тип bytes для байтовых строк.Возможно, вам следует использовать Python 3 по многим другим причинам, но его более согласованная обработка текста, безусловно, является одной из этих причин.

...