我注意到Python的标准字符串方法splitlines()实际上也删除了一些关键的Unicode控制字符。实施例
>>> s1 = u'asdf \n fdsa \x1d asdf'
>>> s1.splitlines()
[u'asdf ', u' fdsa ', u' asdf']
注意“\ x1d”字符如何悄然消失。
如果字符串s1仍然是Python字节串(没有“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))之外的其他字符会受到什么影响?
我在Ubuntu 12.04 LTS上使用Python 2.7.3。
答案 0 :(得分:9)
这确实记录不足;我不得不仔细挖掘源代码才能找到它。
unicodetype_db.h
file将换行符定义为:
case 0x000A:
case 0x000B:
case 0x000C:
case 0x000D:
case 0x001C:
case 0x001D:
case 0x001E:
case 0x0085:
case 0x2028:
case 0x2029:
这些是generated from the Unicode database; Unicode标准中列出的任何代码点,Line_Break
属性设置为BK
,CR
,LF
或NL
或双向类别设置为{{1} }(段落)被视为换行符。
从Unicode Data file, version 6 of the standard列出U + 001D作为段落:
B
(第5列是双向类别)。
如果要限制要拆分的字符,可以使用正则表达式:
001D;<control>;Cc;0;B;;;;;N;INFORMATION SEPARATOR THREE;;;;
对于U + 001C,U + 001D或U + 001E代码点,会将文本拆分为除之外的同一组换行符,因此三个data structuring control characters。