Perl从字符串中删除无效字符,无效的latin1字符

时间:2016-09-25 13:43:05

标签: mysql perl encoding character-encoding

我有一个perl脚本,它从Web服务读取并保存在mysql表中。此表使用latin1。从Web服务中出现了一些错误的字符,需要在将它们保存到数据库之前删除它们,否则它们将保存为“

想要做类似的事情:     的 $ DESC =〜S /// GSI;

但不是删除它们。

包含错误字符的网络服务是: https://jobvacancies.services.businesslink.gov.uk:8443/vacancy/26653478

使用用户代理获取数据,似乎是在utf8中,但需要删除字符:

my $ua = LWP::UserAgent->new ();

$ua->default_headers->push_header ('Accept' => 
                   "text/html,application/xhtml" .
                   "+xml,application/xml");
$ua->default_headers->push_header ('Accept-Charset' => "utf-8");

my $doc = $ua->get ("https://jobvacancies.services.businesslink.gov.uk:8443/vacancy/26653478")

3 个答案:

答案 0 :(得分:2)

如果你只想删除7位ascii集之外的字符(足以用英语显示消息),你可以这样做:

$desc=~s/[^\x00-\x7f]//g

修改:如果您想要更精细的内容支持整个latin-1集,您可以这样做:

use Encode;

$desc=encode('latin-1',$desc,sub {''});

这将完全删除latin-1无法表示的字符。请注意,此行需要utf-8标志为字符串$desc打开,并且生成的字符串将关闭utf-8标志。

最后,如果您想保留欧元符号(€),请注意您不能使用latin-1执行此操作,因为它不是该编码的一部分。您必须使用其他编码,例如ISO-8859-15

答案 1 :(得分:0)

Web服务发送的内容是包含Description标记中的HTML的XML。如果这是您担心的内容,那么删除非Latin-1字符的另一个选择是使用HTML编码对字符进行编码:

$desc =~ s/([^\x00-\x7f])/sprintf("&%d;", ord $1)/ge

以下是一个例子:

$ echo 'é' | perl -C -pE 's/([^\x00-\x7f])/sprintf("&%d;", ord $1)/ge'
&233;

答案 2 :(得分:0)

将列定义更改为CHARACTER SET utf8mb4,以便不需要删除顽皮字符,并且可以实际存储。