2

尝试在 Python 2.7 中做到这一点:

>>> s = u"some\u2028text"
>>> s
u'some\u2028text'
>>> l = s.splitlines(True)
>>> l
[u'some\u2028', u'text']

\u2028是 Left-To-Right Embedding 字符,而不是\ror \n,因此不应分割该行。是有错误还是只是我的误解?

4

2 回答 2

6

\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;
}
于 2013-08-20T00:18:29.197 回答
2

U+2028LINE SEPARATORU+2028U+2029( PARAGRAPH SEPARATOR)都应该被视为换行符,因此 Python 正在做正确的事情。

当然,有时想要在非标准的换行符列表上进行拆分是完全合理的。但是你不能用splitlines. 您将不得不使用split— 并且,如果您需要 的附加功能splitlines,您必须自己实现它们。例如:

return [line.rstrip(sep) for line in s.split(sep)]
于 2013-08-20T00:20:42.143 回答