微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何摆脱Perl和Python中的非ascii字符?

如何解决如何摆脱Perl和Python中的非ascii字符?

| 如何在Perl和Python中摆脱非ascii字符,例如\“ ^ L,¢,â\”?实际上是在Python和Perl中解析PDF文件时。我正在获取这些特殊字符。现在,我有了这些PDF文件的文本版本,但带有这些特殊字符。是否有任何可用功能可以确保文件或变量不应包含任何非ascii字符。     

解决方法

        在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编码问题。为了解决这个问题,您将需要提出更多具体问题,并提供有关您期望和所见事物的具体示例。     ,        为了完整性,提供了一些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 //,â\";
    ,        在Python中,您可以(ab)为此目的使用encoding函数(Python 3提示符):
>>> \"hello swede åäö\".encode(\"ascii\",\"ignore\")
b\'hello swede \'
åäö会产生编码错误,但是由于我在\“ ignore \”上具有错误标志,因此很高兴继续进行。显然,这可以掩盖其他错误。 如果要绝对确定没有遗漏任何“重要”错误,请向
codecs.register_error(name,error_handler)
注册一个错误处理程序。这样您就可以为每个错误实例指定一个替换项。 还要注意,在上面使用Python 3的示例中,我得到了一个字节对象,如果需要一个字符串对象,我将需要正确地转换回Unicode。     

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。