以前用Perl寫過Android包版程式,遇到AP名稱需要XML特殊字元,要改為跳脫字元。於是寫下兩支很妙的副程式:
sub escapeXmlChar{
my$s= shift;
my %esc= (
'&' => '&',
"'" => '′', # ',但單引號在Android的strings.xml無法被編譯,需用倒單引號,原因未知
'<' => '<',
'>' => '>',
'"' => '"'
);
$s=~ s/[&'<>"]/$esc{$&}/g;
return $s;
}
# 反過來則是:
sub XmlChar {
my $s= shift;
my %esc= (
'&' => '&',
''' => "'",
'<' => '<',
'>' => '>',
'"' => '"'
);
$s=~ s/&(amp|apos|lt|gt|quot);/$esc{$&}/g;
return $s;
}
escapeXmlChar是將XML特殊字元轉換成跳脫字元,而XmlChar則是將跳脫字元轉換成特殊字元。最妙的是$&這個變數,是前面符合的pattern變成%esc這個hash裡的key。