【问题标题】:How can I fix garbled multibyte text when using Text::vCard's as_string() method?使用 Text::vCard 的 as_string() 方法时如何修复乱码的多字节文本?
【发布时间】:2015-08-20 17:31:18
【问题描述】:

在 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),但我不确定。

【问题讨论】:

  • 你的程序中有use utf8;吗?
  • @cjm 在 OP 链接的 github 票证中,他有一个完整的代码示例来重现该问题。那里有use utf8

标签: perl utf-8 vcf-vcard


【解决方案1】:

看起来罪魁祸首是 Text::vCard::Node->_wrap_utf8()。通过完全绕过该方法,我至少能够让它停止切割字符。

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

#bypass wrapping
return $key . $value;

…

}

【讨论】:

    猜你喜欢
    • 2018-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-05
    • 1970-01-01
    • 2014-02-03
    • 2017-10-05
    相关资源
    最近更新 更多