Python 检查Unicode的可打印性

Python 检查Unicode的可打印性,python,unicode,Python,Unicode,我知道要检查字符串是否可打印,我们可以执行以下操作: def isprintable(s,codec='utf8'): try: s.codec(codec) except UnicodeDecodeError: return False else: return True 但是有没有办法用Unicode而不是字符串来实现呢? 顺便说一句,我正在处理推文,我将推文转换为Unicode,如下所示 text=unicod

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

def isprintable(s,codec='utf8'):
    try: 
        s.codec(codec)
    except UnicodeDecodeError: 
        return False
    else: 
        return True
但是有没有办法用Unicode而不是字符串来实现呢? 顺便说一句,我正在处理推文,我将推文转换为Unicode,如下所示

text=unicode(status.text)

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

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))
对于代码点超过\u00BE¾的任何unicode文本,这将返回False


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

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))
对于代码点超过\u00BE¾的任何unicode文本,这将返回False


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

import unicodedata

if unicodedata.category(char) == 'Cc':
        raise UnhandledKeypressError('unprintable char')
换句话说,如果字符串的所有字符unicode对象没有值为“control”的属性类别,则该字符串是可打印的

为了进行比较,Qt的QChar.isPrint:

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


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

import unicodedata

if unicodedata.category(char) == 'Cc':
        raise UnhandledKeypressError('unprintable char')
换句话说,如果字符串的所有字符unicode对象没有值为“control”的属性类别,则该字符串是可打印的

为了进行比较,Qt的QChar.isPrint:

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


字符串上没有.codec方法。。你的意思是可能解码吗?相反的是。将文本编码为UTF8。但所有Unicode代码点都可编码为UTF-8,因此这将始终成功,因此您需要澄清“可打印”的含义。最后但并非最不重要的一点是,如果您通过JSON API加载tweet,则它们已经作为Unicode对象返回,前提是您或您使用JSON模块解码为python的库;我猜想,在英语世界之外的许多国家,“典型键盘”对你来说都是陌生的。恐怕你得把范围缩小一点。我看过很多英文推文,上面都有拉丁字符。那么所有流行的Unicode表情符号呢?如果你忽略了那些能让我走的路(╯°□°)╯︵\ .o、 \字符串上没有.codec方法。。你的意思是可能解码吗?相反的是。将文本编码为UTF8。但所有Unicode代码点都可编码为UTF-8,因此这将始终成功,因此您需要澄清“可打印”的含义。最后但并非最不重要的一点是,如果您通过JSON API加载tweet,则它们已经作为Unicode对象返回,前提是您或您使用JSON模块解码为python的库;我猜想,在英语世界之外的许多国家,“典型键盘”对你来说都是陌生的。恐怕你得把范围缩小一点。我看过很多英文推文,上面都有拉丁字符。那么所有流行的Unicode表情符号呢?如果你忽略了那些能让我走的路(╯°□°)╯︵\ .o、 \U+FFFF之后的字符如何?@ecatmur:JSON不允许这些字符;tweepy使用twitter JSON API。我怀疑Twitter甚至不接受这些代码点,JSON确实接受>0xFFFF。即使使用unicode转义序列,它也只是代理,例如@Esailija:right,因为ECMA脚本标准规定源代码应该用UTF-16编码;\uffff上的代码点需要使用代理。JSON标准在这一点上有点含糊不清,它允许“任何Unicode字符”以及四个十六进制数字转义码。ECMA脚本标准对\uFFFF上的码点也没有转义序列,顺便说一句,该标准规定,除非另有说明,否则一个实现被假定只支持BMP码点。@MartijnPiers这里的JSON规范在最后一段中以2.5个字符串表示。要转义不在基本多语言平面中的扩展字符,该字符将表示为12个字符的序列,对UTF-16代理项对进行编码。因此,例如,仅包含G谱号字符U+1D11E的字符串可以表示为\uD834\uDD1E。这只是关于解析,无论是宽构建还是窄构建都无关紧要。超过U+FFFF的字符如何?@ecatmur:JSON不允许这些;tweepy使用twitter JSON API。我怀疑Twitter甚至不接受这些代码点,JSON确实接受>0xFFFF。即使使用unicode转义序列,它也只是代理,例如@Esailija:right,因为ECMA脚本标准规定源代码应该用UTF-16编码;代码点超过\uffff需要
使用代理。JSON标准在这一点上有点含糊不清,它允许“任何Unicode字符”以及四个十六进制数字转义码。ECMA脚本标准对\uFFFF上的码点也没有转义序列,顺便说一句,该标准规定,除非另有说明,否则一个实现被假定只支持BMP码点。@MartijnPiers这里的JSON规范在最后一段中以2.5个字符串表示。要转义不在基本多语言平面中的扩展字符,该字符将表示为12个字符的序列,对UTF-16代理项对进行编码。因此,例如,仅包含G谱号字符U+1D11E的字符串可以表示为\uD834\uDD1E。这仅仅是关于解析的,不管是宽构建还是窄构建。