如何在Perl和Python中去除非ASCII字符?
如何在Perl和Python中去掉像"^L,¢,â"这样的非ASCII字符?其实是在解析PDF文件的时候,我在Python和Perl中遇到了这些特殊字符。现在我有这些PDF文件的文本版本,但里面夹杂着这些特殊字符。有没有什么函数可以确保一个文件或变量里不包含任何非ASCII字符呢?
3 个回答
在Python中,你可以用encode函数来实现这个目的(这是Python 3的提示):
>>> "hello swede åäö".encode("ascii", "ignore")
b'hello swede '
当遇到字符åäö时,会出现编码错误,但因为我把错误处理设置为“忽略”,所以程序就会继续运行。显然,这样做可能会掩盖其他重要的错误。
如果你想确保不会漏掉任何“重要”的错误,可以使用codecs.register_error(name, error_handler)
来注册一个错误处理器。这样你就可以为每种错误指定一个替代方案。
另外要注意,在上面的例子中,使用Python 3时我得到的是一个字节对象,如果我需要字符串对象,就得把它转换回Unicode格式。
为了让内容更完整,这里提供一些Perl的解决方案。这些方案都返回,,
。和被认可的Python答案不同,我没有使用像32或128这样的神秘数字。在这里的常量可以在文档中更容易找到。
use 5.014; use Encode qw(encode); encode('ANSI_X3.4-1968', "\cL,¢,â", sub{q()}) =~ s/\p{PosixCntrl}//gr;
use 5.014; use Unicode::UCD qw(charinfo); join q(), grep { my $u = charinfo ord $_; 'Basic Latin' eq $u->{block} && 'Cc' ne $u->{category} } split //, "\cL,¢,â";
直接回答你的问题,在Python中,可以使用 .encode('ascii', 'ignore')
来处理你提到的Unicode字符串。这段代码会把Unicode字符串转换成ASCII字符串,并且会把所有非ASCII字符去掉:
>>> u'abc\x0c¢â'.encode('ascii', errors='ignore')
'abc\x0c'
需要注意的是,它并没有去掉 '\x0c'。我提到这个是因为你提到了字符“^L”,我猜你指的是换页符 '\x0c',这个字符可以通过按Ctrl+L输入。这个是一个ASCII字符,如果你想把它去掉,你还需要写一些其他的代码来处理,比如:
>>> str(''.join([c for c in u'abc\x0c¢â' if 32 <= ord(c) < 128]))
'abc'
但是,这可能对你没有帮助,因为我怀疑你并不只是想删除这些字符,而是想解决它们为什么会出现的问题。在这种情况下,问题可能是由于Unicode编码引起的。要解决这个问题,你需要提出更具体的问题,并给出具体的例子,说明你期望的结果和你实际看到的结果。