Python字符串splitlines()删除某些Unicode控制字符

Python字符串splitlines()删除某些Unicode控制字符,python,unicode,Python,Unicode,我注意到Python的标准字符串方法splitlines()实际上也删除了一些关键的Unicode控制字符。范例 >>> s1 = u'asdf \n fdsa \x1d asdf' >>> s1.splitlines() [u'asdf ', u' fdsa ', u' asdf'] 请注意“\x1d”字符是如何悄悄消失的 但是,如果字符串s1仍然是Python ByTestString(没有“u”前缀),则不会发生这种情况: 我在参考资料中找不到有关这方

我注意到Python的标准字符串方法splitlines()实际上也删除了一些关键的Unicode控制字符。范例

>>> s1 = u'asdf \n fdsa \x1d asdf'
>>> s1.splitlines()
[u'asdf ', u' fdsa ', u' asdf']
请注意“\x1d”字符是如何悄悄消失的

但是,如果字符串s1仍然是Python ByTestString(没有“u”前缀),则不会发生这种情况:

我在参考资料中找不到有关这方面的任何信息

为什么会发生这种情况?除了“\x1d”(或unichr(29))之外,还有哪些字符受到影响


我在Ubuntu12.04 LTS上使用Python2.7.3。

这确实是没有文档记录的;为了找到它,我不得不翻阅源代码

将换行符定义为:

case 0x000A:
case 0x000B:
case 0x000C:
case 0x000D:
case 0x001C:
case 0x001D:
case 0x001E:
case 0x0085:
case 0x2028:
case 0x2029:
这些是,;Unicode标准中列出的
换行符
属性设置为
BK
CR
LF
NL
或双向类别设置为
B
(段落换行符)的任何代码点都被视为换行符

从列表U+001D中,将其作为段落分隔符:

001D;<control>;Cc;0;B;;;;;N;INFORMATION SEPARATOR THREE;;;;
除了U+001C、U+001D或U+001E代码点之外,将在同一组换行符上拆分文本,因此这三个代码点是相同的

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

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