我有一个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")
答案 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
,以便不需要删除顽皮字符,并且可以实际存储。