Python 2.7でこれを作成しようとしています:
>>> s = u"some\u2028text"
>>> s
u'some\u2028text'
>>> l = s.splitlines(True)
>>> l
[u'some\u2028', u'text']
\u2028
\r
またはではなく、左から右への埋め込み文字で\n
あるため、行が分割されません。バグですか、それとも私の誤解ですか?
\u2028
は LINE SEPARATOR、左から右への埋め込みは\u202A
:
>>> import unicodedata
>>> unicodedata.name(u'\u2028')
'LINE SEPARATOR'
>>> unicodedata.name(u'\u202A')
'LEFT-TO-RIGHT EMBEDDING'
改行と見なされるコードポイントのリストは、Python ソース (python 2.7、私のコメント) で簡単に確認できます (見つけるのはそれほど簡単ではありません)。
/* Returns 1 for Unicode characters having the line break
* property 'BK', 'CR', 'LF' or 'NL' or having bidirectional
* type 'B', 0 otherwise.
*/
int _PyUnicode_IsLinebreak(register const Py_UNICODE ch)
{
switch (ch) {
// Basic Latin
case 0x000A: // LINE FEED
case 0x000B: // VERTICAL TABULATION
case 0x000C: // FORM FEED
case 0x000D: // CARRIAGE RETURN
case 0x001C: // FILE SEPARATOR
case 0x001D: // GROUP SEPARATOR
case 0x001E: // RECORD SEPARATOR
// Latin-1 Supplement
case 0x0085: // NEXT LINE
// General punctuation
case 0x2028: // LINE SEPARATOR
case 0x2029: // PARAGRAPH SEPARATOR
return 1;
}
return 0;
}
U+2028
ですLINE SEPARATOR
。U+2028
とU+2029
( PARAGRAPH SEPARATOR
)は両方とも改行として扱われるべきなので、Python は正しいことをしています。
もちろん、非標準の改行文字リストで分割したいというのは、完全に理にかなっている場合もあります。しかし、あなたはそれを行うことはできませんsplitlines
。を使用split
する必要があり、 の追加機能が必要な場合はsplitlines
、自分で実装する必要があります。例えば:
return [line.rstrip(sep) for line in s.split(sep)]