Шестнадцатеричные escape-последовательности, которые вам не нравятся, — это не дефисы (ASCII 39) и одинарные кавычки (ASCII 45). Это типографские дефисы (также известные как короткие тире) –
(Unicode 2010) и правые одиночные («умные») кавычки ’
(Unicode 2019). Они кодируются как UTF-8. Если вы хотите их декодировать, рассматривайте строку, содержащую их, как байты, а не как строку (обратите внимание на префикс b
):
>>> mystring = b"This is an en\xe2\x80\x93dash and this - isn\xe2\x80\x99t"
>>> mystring.decode('UTF8')
'This is an en–dash and this - isn’t'
Если Python считает, что данные уже являются строкой, как показано ниже, без префикса b
, вам нужно убедить его, что это действительно байты, и расшифровать результат:
>>> mystring = "This is an en\xe2\x80\x93dash and this - isn\xe2\x80\x99t"
>>> bytes(mystring.encode("latin-1")).decode("UTF-8")
'This is an en–dash and this - isn’t'
В шрифте, который использует SO, нет очевидных различий между ASCII 39 и Unicode 2010, но в целом типографский дефис короче, толще и ближе к базовой линии, чем дефис ASCII. Различие между двумя другими довольно ясно в isn’t'
. Часто можно найти варианты Unicode в .pdf
файлах, потому что они предназначены для печати. Варианты ASCII действительно подходят только для программного кода и эмуляции старых пишущих машинок; непечатные книги и журналы.
person
BoarGules
schedule
01.02.2019
-
(ASCII 45) и одинарные кавычки'
(ASCII 39), а типографские дефисы‐
(Unicode 2010) и правые одинарные кавычки Unicode’
(Unicode 2019). - person BoarGules   schedule 31.01.2019