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 af では正しいです)。それでも os.linesep は \n が eol 文字であると報告するため、一番下のステートメントは何もしません。もちろん、そのステートメントの出力は次のようになります。

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

OSXでos.linesepが間違ったeol文字を報告しているように見える理由を知っている人はいますか?

4

1 に答える 1

2

いいえ、\r(キャリッジ リターン、または) は古いMac OS でCRのみ正しいため、リリース 9 までです。

OS X は完全に書き直され、現在は UNIX ベースの OS です。\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 ファミリー、バージョン 9 までの Mac OS および OS-9

この背後にある歴史については、さまざまなプラットフォームで終わるさまざまな行の背後にある歴史的な理由を参照してください。

代わりに、ここで間違っているのはシンティラです。行末のドキュメントでは\r、Macではデフォルトで次のようになっていることが示唆されています。

\rScintilla は、Macintosh ( )、Unix ( \n)、Windows ( \r\n) のいずれの行末も解釈できます。

このSCI_SETEOLMODE()関数を使用してその動作を変更できます。Python バインディングに相当するものにos.linesep値を渡して、Scintilla がプラットフォームに適した行区切りを使用するようにする必要があります。

それを達成するためのQsciScintilla.setEolMode()メソッドEOLMode列挙型があることがわかりました。Python の行末バリアントを列挙型にマップし、正しい列挙値を.setEolMode()メソッドに渡す必要があると思います。

于 2013-05-15T14:25:00.733 に答える