Python | C-строки сомнительного кодирования | Комплект-2

Опубликовано: 12 Апреля, 2022

Обработка строк в модулях расширения представляет собой проблему. Строки C в расширениях могут не соответствовать строгим правилам кодирования / декодирования Unicode, которых обычно ожидает Python. Таким образом, возможно, что некоторые искаженные данные C будут переданы в Python. Хорошим примером могут быть строки C, связанные с низкоуровневыми системными вызовами, такими как имена файлов. Например, что произойдет, если системный вызов вернет интерпретатору неверную строку, которая не может быть правильно декодирована.

Обычно ошибки Unicode часто обрабатываются путем определения какой-либо политики ошибок, например, строгой, игнорирования, замены или чего-то подобного. Однако обратная сторона этих политик заключается в том, что они безвозвратно уничтожают исходное содержимое строки.
Например, если искаженные данные в примере были декодированы с использованием одной из этих политик, вы получите результаты, как показано ниже:

Code #1 :

raw = b"Spicy Jalapexc3xb1oxae"
  
print (raw.decode("utf-8", "ignore"))
  
print (raw.decode("utf-8", "replace"))

Выход :

'Пряный халапеньо'
«Пряный халапеньо?»

Surrogateescape обработка ошибок политик принимают все nondecodable байт и превращают их в низкой половину суррогатной пары ( udcXX где XX является исходным значением байта).

Code #2 :

print (raw.decode("utf-8", "surrogateescape"))

Выход :

 'Пряный халапеньо  udcae'

Изолированные младшие суррогатные символы, такие как udcae, никогда не появляются в допустимом Unicode. Таким образом, эта строка технически является недопустимым представлением. Фактически, если кто-то попытается передать его функциям, выполняющим вывод, возникнут ошибки кодирования.

Code #3 :

s = raw.decode("utf-8", "surrogateescape")
print(s)

Выход :

 Отслеживание (последний вызов последний):
Файл "", строка 1, в 
UnicodeEncodeError: кодек utf-8 не может кодировать 
символ ' udcae' в позиции 14: суррогаты не разрешены

Однако основная цель разрешения суррогатных экранирований - позволить искаженным строкам переходить от C к Python и обратно в C без какой-либо потери данных. Когда строка снова кодируется с использованием суррогатного экранирования, суррогатные символы возвращаются в свои исходные байты. Например:

Code #4:

print (s)
print(s.encode("utf-8", "surrogateescape"))

Выход :

 'Пряный халапеньо  udcae'
b'Острый халапе  xc3  xb1o  xae '

Как правило, лучше по возможности избегать суррогатного кодирования. Код будет намного надежнее, если будет использовать правильные кодировки. Однако иногда бывают ситуации, когда у кого-то просто нет контроля над кодировкой данных, и кто-то не может игнорировать или заменять плохие данные, потому что другие функции могут нуждаться в их использовании.

As a final note, many of Python’s system-oriented functions, especially those related to filenames, environment variables, and command-line options, use surrogate encoding. For example, if a function such as os.listdir() is used on a directory containing an undecodable filename, it will be returned as a string with surrogate escapes.

Внимание компьютерщик! Укрепите свои основы с помощью базового курса программирования Python и изучите основы.

Для начала подготовьтесь к собеседованию. Расширьте свои концепции структур данных с помощью курса Python DS. А чтобы начать свое путешествие по машинному обучению, присоединяйтесь к курсу Машинное обучение - базовый уровень.