1

我知道要检查字符串是否可打印,我们可以执行以下操作:

def isprintable(s,codec='utf8'):
    try: 
        s.codec(codec)
    except UnicodeDecodeError: 
        return False
    else: 
        return True

但是有没有办法用 Unicode 而不是字符串呢?顺便说一句,我正在处理推文,我将推文转换为 Unicode,如下所示

text=unicode(status.text)
4

2 回答 2

12

面对 Unicode 标准更改或不同的编码,我不确定使用代码点的解决方案是否可靠。一个更抽象的解决方案:

import unicodedata

if unicodedata.category(char) == 'Cc':
        raise UnhandledKeypressError('unprintable char')

换句话说,如果字符串的所有字符(unicode 对象)不具有值为“控制”的属性类别,则该字符串是可打印的。

为了比较,Qt 的 QChar.isPrint() :

如果字符是可打印字符,则返回 true;否则返回假。这是任何不属于 Cc 或 Cn 类别的字符。请注意,这并未表明该字符是否可用于特定字体。

于 2014-03-25T10:42:24.770 回答
1

您正在寻找对一系列代码点的测试,因此您需要一个正则表达式:

import re
# match characters from ¿ to the end of the JSON-encodable range
exclude = re.compile(ur'[\u00bf-\uffff]')

def isprintable(s):
    return not bool(exclude.search(s))

这将返回任何代码点过去("¾")False的 unicode 文本。\u00BE

>>> isprintable(u'Hello World!')
True
>>> isprintable(u'Jeg \u00f8ve mit Norsk.')
False
于 2013-01-17T17:05:07.910 回答