如何去掉Perl&中的非ascii字符Python [都]?

时间:2011-06-15 07:10:52

标签: python perl pdf

如何摆脱Perl&amp ;;中的“^ L,¢,â”等非ascii字符Python?实际上在解析Python文件中的PDF文件时Perl的。我得到了这些特殊的角色。现在我有这些PDF文件的文本版本,但有这些特殊字符。是否有任何可用的函数可以确保文件或变量不应包含任何非ascii字符。

3 个答案:

答案 0 :(得分:6)

在Python中,对问题的直接回答是在有问题的Unicode字符串上使用.encode('ascii', 'ignore')。这会将Unicode字符串转换为ASCII字符串并取出任何非ASCII字符:

>>> u'abc\x0c¢â'.encode('ascii', errors='ignore')
'abc\x0c'

请注意,它没有取出'\ x0c'。我把它放进去是因为你提到了字符“^ L”,我假设你的意思是你可以用Ctrl + L输入的换页字符'\ x0c'。那个一个ASCII字符,如果你想把它拿掉,你还需要编写一些其他代码来删除它,例如:

>>> str(''.join([c for c in u'abc\x0c¢â' if 32 <= ord(c) < 128]))
'abc'

但这可能对你没有帮助,因为我怀疑你不只是想删除这些字符,而是实际上解决了与他们为什么在那里有关的问题。在这种情况下,可能是因为Unicode编码问题。要解决这个问题,您需要提出更具体的问题,并提供有关您的期望和所见内容的具体示例。

答案 1 :(得分:5)

为了完整起见,一些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,¢,â";

答案 2 :(得分:2)

在Python中,你可以(ab)为此目的使用encode函数(Python 3提示符):

>>> "hello swede åäö".encode("ascii", "ignore")
b'hello swede '

åäö产生编码错误,但由于我在“忽略”上有错误标志,所以很高兴继续。显然这可以掩盖其他错误。

如果您想绝对确定没有遗漏任何“重要”错误,请使用codecs.register_error(name, error_handler)注册错误处理程序。这将允许您为每个错误实例指定替换。

另请注意,在上面的示例中使用Python 3我得到一个字节对象,如果需要字符串对象,我需要转换回适当的Unicode。