Outlook 中 PHP 生成的 vCard 的字符编码问题

Posted

技术标签:

【中文标题】Outlook 中 PHP 生成的 vCard 的字符编码问题【英文标题】:Character encoding issues with PHP generated vCards in Outlook 【发布时间】:2013-03-18 06:59:56 【问题描述】:

我们在尝试在 php 中创建 vcard 时遇到字符编码问题。

在 Outlook 中,使用特殊字符的名称会被扭曲,例如“é”变成“é”。

我们更新了 Windows 字符编码的标题以及 FN 和 N 部分,但问题仍然存在。

感谢任何建议。

电子名片摘录:

BEGIN:VCARD
VERSION:3.0
REV:2013-03-27 19:37:46
FN;CHARSET=Windows-1252:Namé S. Nameé
N;CHARSET=Windows-1252:Namé;Namé;;;
TITLE:Associate
ORG:Company
EMAIL;TYPE=internet,pref:name@abc.com
TZ:-0400
END:VCARD

Vcard 的 PHP 头文件:

    header("Content-type: text/x-vcard; charset=windows-1252;");
    header("Content-Length: ".strlen($vc->card));
    header("Content-Disposition: attachment; filename=".$vcard_name.".vcf");
    header("Pragma: public");

【问题讨论】:

进入编辑器中的编码选项,将其从 utf8 更改为 windows-1252,然后保存文件。 PHP 脚本会动态生成 vcard 文件,因此任何解决方案都必须先解决问题,然后才能在 Outlook 中打开它。 打开你的 php 文件去你的编辑器中的编码选项,将它从 utf8 更改为 windows-1252 然后保存文件。 @Musa 谢谢,但我认为您没有遵循我们想要的...我们正在尝试使用 PHP 脚本生成多个 vcard,并且我们已经在标题中指定了该编码。在本地重新保存一张卡片并不能解决问题,因为我们首先需要正确打开卡片。 设置内容类型不会将utf-8更改为windows-1252,您必须使用编辑器或php(例如iconv)进行转换 【参考方案1】:

您的解决方案对我不起作用,我在 Windows 上仍然有有趣的字符。

对我有用的是改用 ISO-8859-1。您可以在 PHP 中使用 utf8-decode() 将 UTF8 转换为 ISO-8859-1,并通过在 Vcard 中使用 ENCODING=iso-8859-1 的相关字段使其适用于我测试过的大多数基于 UTF-8 的客户端。

标题:

Content-Type: text/x-vcard; charset=iso-8859-1

电子名片示例:

N;CHARSET=iso-8859-1:Göteborg

在 Windows、OS X、iosandroid 上测试。

【讨论】:

这个解决方案也适用于我,在 iOS 13.4.1 和 macOS 10.14.6 上测试【参考方案2】:

有一些类似的问题,但似乎没有明确的答案。通过在 vcard 字段中指定字符集,看起来我已经完成了一半。

我终于通过将以下内容更改为“utf-8;”来让它工作:

 header("Content-type: text/x-vcard; charset=CHARSET=utf-8;");

vcard 本身的名称字段也是如此。指定 utf-8 似乎解决了特殊字符的显示问题:

$this->card .= "FN;CHARSET=utf-8:".$new_display_name.$this->data['short_mode'];
    $this->card .= "N;CHARSET=utf-8:"

在 Outlook 2007 中打开,所有重音字符都按预期显示。

【讨论】:

以上是关于Outlook 中 PHP 生成的 vCard 的字符编码问题的主要内容,如果未能解决你的问题,请参考以下文章

MS“VCard”法国特色字符

Excel 转 vCard格式CSV格式

从 AddressBook.framework 生成 vCard

生成 VCard 并通过 Twilio 发送

利用vcard和qrcode.js生成二维码导入联系人

PHP 下载vCard脚本