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

时间:2014-06-27 14:00:42

标签: python unicode

我注意到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。

1 个答案:

答案 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属性设置为BKCRLFNL或双向类别设置为{{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