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