Гексаны, которые вам не нравятся, не являются дефисами (ASCII 39) и одиночными кавычками (ASCII 45).Это типографские дефисы (aka en-dashes) –
(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 действительно подходят только для программного кода и эмуляции старых пишущих машинок;непечатные книги и журналы.