使用Text :: vCard的as_string()方法时,如何修复乱码的多字节文本?

时间:2015-08-20 17:31:19

标签: perl utf-8 vcard

在NOTE节点中使用多字节UTF-8字符时,换行符周围的字符会出现乱码/丢失。

例如:

$vcard = $address_book->add_vcard();
$vcard->version('3.0');
$vcard->FN('Tèśt Ûšér');
$vcard->NOTE('①②③④⑤⑥⑦⑧⑨⑩⑪⑫⑬⑭⑮⑯⑰⑱⑲⑳①②③④⑤⑥⑦⑧⑨⑩⑪⑫⑬⑭⑮⑯⑰⑱⑲⑳①②③④⑤⑥⑦⑧⑨⑩⑪⑫⑬⑭⑮⑯⑰⑱⑲⑳①②③④⑤⑥⑦⑧⑨⑩⑪⑫⑬⑭⑮⑯⑰⑱⑲⑳');
say $vcard->as_string();

产地:

BEGIN:VCARD
VERSION:3.0
FN:Tèśt Ûšér
NOTE:①②③④⑤⑥⑦⑧⑨⑩⑪��
 �⑬⑭⑮⑯⑰⑱⑲⑳①②③④
 ⑤⑥⑦⑧⑨⑩⑪⑫⑬⑭⑮⑯�
 ��⑱⑲⑳①②③④⑤⑥⑦⑧��
 �⑩⑪⑫⑬⑭⑮⑯⑰⑱⑲⑳①
 ②③④⑤⑥⑦⑧⑨⑩⑪⑫⑬�
 ��⑮⑯⑰⑱⑲⑳
END:VCARD

如何修复此问题?我还将其发布为an issue on the text-vcard project page。我认为这与新行的插入方式有关(通过插入原始字节:\ x0D \ x0A),但我不确定。

1 个答案:

答案 0 :(得分:1)

看起来罪魁祸首是Text :: vCard :: Node-> _wrap_utf8()。我至少可以通过绕过这种方法来阻止字符切割。

sub _wrap_utf8 {
my ( $self, $key, $value, $max, $newline ) = @_;

#bypass wrapping
return $key . $value;

…

}