Python string splitlines () удаляет определенные управляющие символы Юникода

Я заметил, что стандартный строковый метод Python splitlines() фактически удаляет некоторые важные управляющие символы Unicode. Пример

>>> s1 = u'asdf n fdsa x1d asdf'
>>> s1.splitlines()
[u'asdf ', u' fdsa ', u' asdf']

обратите внимание, как символ "x1d " тихо исчезает.

этого не происходит, если строка s1 по-прежнему является Python bytestring, хотя (без префикса "u"):

>>> s2 = 'asdf n fdsa x1d asdf'
>>> s2.splitlines()
['asdf ', ' fdsa x1d asdf']

Я не могу найти никакой информации об этом в ссылка https://docs.python.org/2.7/library/stdtypes.html#str.splitlines.

почему это происходит? Какие еще символы, кроме "x1d" (или unichr(29)), затронуты?

Я использую Python 2.7.3 на Ubuntu 12.04 LTS.

1 ответов


это действительно недокументировано; мне пришлось немного покопаться в исходном коде, чтобы найти его.

на определяет linebreaks как:

case 0x000A:
case 0x000B:
case 0x000C:
case 0x000D:
case 0x001C:
case 0x001D:
case 0x001E:
case 0x0085:
case 0x2028:
case 0x2029:

это генерируется из базы данных Unicode; любая кодовая точка, указанная в стандарте Юникода с Line_Break свойство имеет значение BK, CR, LF или NL или с двунаправленной категорией, установленной в B (абзац) является линия ломать.

С файл данных Unicode, версия 6 стандарта перечисляет U + 001D как разрыв абзаца:

001D;<control>;Cc;0;B;;;;;N;INFORMATION SEPARATOR THREE;;;;

(5-й столбец-это двунаправленный категории).

вы можете использовать регулярное выражение, Если хотите ограничить, какие символы разделить на:

import re

linebreaks = re.compile(ur'[\n-\r\x85\u2028\u2929]')
linebreaks.split(yourtext)

разделил бы ваш текст на тот же набор linebreaks за исключением для U+001C, U+001D или U + 001E кодовых точек, так что три сведения структурирование управляющих символов.