2013-05-15 8 views
0

Платформа: OS X Mountain Lion
Python 2.7.4Python: некорректное os.linesep на OS X

У меня есть кусок сценария, который нужно преобразовать все символы Eol в строке в стиле Unix \ п. Я получаю строку, предоставленную Qsci.Scintilla.text(), на которую ссылается ниже как txt.

print 'original text: %s' % repr(unicode(txt)) 
print 'linesep: %s' % repr(os.linesep) 
print 'fixed text: %s' % repr(unicode(txt).replace(os.linesep, '\n')) 

Это показывает выход, как:

original text: u'exp.cnvs.show()\rself.sleep(1000)' 
linesep: '\n' 
fixed text: u'exp.cnvs.show()\rself.sleep(1000)' 

Все персонажи Eol там приводятся как \ г (который является правильным для OS X аф насколько я знаю). Тем не менее os.linesep сообщает \ n, чтобы быть символом eol, в результате чего нижний оператор ничего не делает. Выходной сигнал этого заявления, конечно, должен был быть:

fixed text: u'exp.cnvs.show()\nself.sleep(1000)' 

Кто-нибудь знает, почему os.linesep появляется, чтобы сообщить неправильную Eol символа на OSX?

ответ

2

Нет, \r (возврат каретки или CR) верно только для старой Mac OS, так что до выпуска 9.

OS X полностью переписан, и теперь ОС UNIX на основе. Он использует \n (line feed, или LF).

От Wikipedia on the subject of Newline:

  • LF: Multics, Unix и Unix-подобных системах (GNU/Linux, Mac OS X, FreeBSD, AIX, Xenix и т.д.), BeOS, Amiga, RISC OS и другие.

[...]

  • CR: Commodore 8-битных машин, Acorn BBC, ZX Spectrum, TRS-80, семья Apple II, Mac OS до версии 9 и OS-9

См. Historical reason behind different line ending at different platforms для некоторой истории за этим.

Вместо этого здесь находится Сцинтилла. Line endings documenation предполагает, что по умолчанию в \r, когда на Mac:

Scintilla может интерпретировать любой из Macintosh (\r), Unix (\n) и Windows (в \r\n) линия заканчивается.

Вы можете использовать SCI_SETEOLMODE() function, чтобы изменить это поведение, независимо от привязки эквивалент Питона должна быть передана значением os.linesep, чтобы сделать Scintilla использовать правильный разделитель строки для вашей платформы.

Я вижу, что есть QsciScintilla.setEolMode() method и EOLMode enum для этого; Я думаю, вам нужно сопоставить варианты завершения строки python с перечислением и передать правильное значение enum методу .setEolMode().

+0

Хорошо, это имеет смысл. Почему Qscintilla затем все еще возвращает текст с символом \ r в качестве символа новой строки? –

+0

@ DanielS: Возможно, это ошибка в Qscintilla? –

+0

@ DanielS: Ах, Сцинтилла довольно устарела; [документация, найденная мной] (http://www.scintilla.org/ScintillaDoc.html#LineEndings) действительно предполагает, что '\ r' используется независимо от версии Mac OS. Настройка 'SCI_SETEOLMODE' на' os.linesep', кажется, хорошая работа. –