0

平台:OS X Mountain Lion
Python 2.7.4

我有一段脚本需要将字符串中的所有 eol 字符转换为 unix 样式\n。我得到一个由 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 字符都报告为 \r (据我所知,这对于 OS X 是正确的)。仍然 os.linesep 报告 \n 是 eol 字符,导致底部语句什么都不做。该声明的输出当然应该是:

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

有谁知道为什么 os.linesep 似乎在 OSX 上报告了错误的 eol 字符?

4

1 回答 1

2

不,\r(回车,或CR)仅适用于Mac OS,因此直到版本 9。

OS X 完全重写,现在是基于 UNIX 的操作系统。它使用\n(换行符,或LF)。

来自维基百科关于 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

请参阅以不同平台结尾的不同线路背后的历史原因,了解这背后的一些历史。

相反,这里错的是 Scintilla。行结尾文档表明它默认为\r在 Mac 上时:

Scintilla 可以解释任何 Macintosh ( \r)、Unix ( \n) 和 Windows ( \r\n) 行结尾。

您可以使用该SCI_SETEOLMODE()函数来更改该行为,无论 Python 绑定等效项是什么,都应传递该os.linesep值以使 Scintilla 为您的平台使用正确的行分隔符。

我看到有一种QsciScintilla.setEolMode()方法和一个EOLMode枚举来完成它;我想您需要将 python 行结尾变体映射到枚举并将正确的枚举值传递给该.setEolMode()方法。

于 2013-05-15T14:25:00.733 回答