平台: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 \ n(据我所知,这对于OS X是正确的)。仍然os.linesep报告\ n是eol字符,导致底部语句什么都不做。当然,该陈述的结果应该是:
fixed text: u'exp.cnvs.show()\nself.sleep(1000)'
有谁知道为什么os.linesep似乎在OSX上报告错误的eol字符?
答案 0 :(得分:2)
不,\r
(回车或CR
)仅适用于旧 Mac OS,因此最高版本为9。
OS X是一个完整的重写,现在是一个基于UNIX的操作系统。它使用\n
(换行符,或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。
相反,这里的Scintilla错了。 Line endings documenation表示在Mac上默认为\r
:
Scintilla可以解释任何Macintosh(
\r
),Unix(\n
)和Windows(\r\n
)行结束。
您可以使用SCI_SETEOLMODE()
function来改变该行为,无论Python绑定等效值应该传递os.linesep
值,以使Scintilla为您的平台使用正确的行分隔符。
我发现有一个QsciScintilla.setEolMode()
method和一个EOLMode
enum可以实现这一目标;我想你需要将python行结束变量映射到枚举,并将正确的枚举值传递给.setEolMode()
方法。