См. JWilliams 'ответ , где сообщать об ошибках в GitHub.[Редактировать: возможно, это должен быть ответ на ваш другой вопрос .]
Для чего бы то ни было, не стоит использовать что-то кроме UTF-8 для автора и коммиттеракодировка имени - поле encoding
заголовка слишком сложно применить к части заголовка перед телом, так как оно находится в конце строк:
>>> import subprocess
>>> p = subprocess.Popen(['git', 'cat-file', '-p', 'HEAD'], stdout=subprocess.PIPE)
>>> o = p.stdout.read()
>>> hdr, body = o.split('\n\n', 1)
>>> hdr = hdr.splitlines()
строки заголовка длинныедаже после разделения:
>>> import pprint
>>> pprint.pprint(hdr)
['tree 79036d838fc5ce13e849949d02e6048c2d33c561',
'author \xc5\x99\x89\x83@\xc8\x96\x97\x97\x85\x99 <\x88\x96\x97\x97\x85\x99|\x96\x94\x95\x89\x86\x81\x99\x89\x96\xa4\xa2K\x96\x99\x87> 1528844508 -0700',
'committer \xc5\x99\x89\x83@\xc8\x96\x97\x97\x85\x99 <\x88\x96\x97\x97\x85\x99|\x96\x94\x95\x89\x86\x81\x99\x89\x96\xa4\xa2K\x96\x99\x87> 1528844508 -0700',
'encoding cp037']
, но мы видим, что кодировка идет последней.Если бы в кодировке было что-то, имеющее байт-коды, похожие на символы новой строки (к счастью, cp037
нет), мы бы не смогли проанализировать сам заголовок.
Однако для тела это хорошая идеяиспользовать информацию о кодировке заголовка.Если мы работаем над чем-то, что имеет имеющуюся кодировку, то хорошо:
>>> body.decode('cp037')
u'Well, this should be interesting.\x8e'
(Python 2.7 здесь, конечно).
Очевидно, что ни GitHub, ни мой Git наэта машина может сделать это для cp037
, но на этом конкретном хосте это неудивительно:
$ iconv -f cp037
iconv: conversion from cp037 unsupported
На другой машине с установленным набором символов iconv работает.Я не пробовал этот коммит в Git, но пропустил через него строку байтов строки заголовка;В результате получилось:
>>> import subprocess
>>> p = subprocess.Popen(['iconv', '-f', 'cp037'], stdin=subprocess.PIPE, stdout=subprocess.PIPE)
>>> so, se = p.communicate(s)
>>> so
'Eric Hopper\xc2\x80\x14hopper@omnifarious.org\xc2\x9e'
Как видите, угловые скобки были повреждены при переводе (поскольку анализ здесь был слишком простым - нам нужно было бы осторожно избегать их перевода).Опять же, однако, опасности очевидны: что если кодировка выдает >
?