簡體   English   中英

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

[英]Python string splitlines() removes certain Unicode control characters

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

這確實沒有記錄; 我不得不仔細挖掘源代碼才能找到它。

unicodetype_db.h文件將換行符定義為:

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

這些是從Unicode數據庫生成的 ; Unicode標准中列出的任何代碼點, Line_Break屬性設置為BKCRLFNL或雙向類別設置為B (段落Line_Break )被視為換行符。

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)

除了 U + 001C,U + 001D或U + 001E代碼點之外 ,會將文本拆分為同一組換行符,因此三個數據結構控制字符

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM