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、ios 和 android 上测试。
【讨论】:
这个解决方案也适用于我,在 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 的字符编码问题的主要内容,如果未能解决你的问题,请参考以下文章