PHP:将特殊字符转换为HTML实体的正确方法,用于电子邮件的html源代码

时间:2017-01-21 07:55:30

标签: php html email html-email html-escape-characters

我在字符串中有UTF-8文本(我们称之为“纯文本”),我需要在HTML代码中注入该文本。

我正在使用htmlspecialchars将特殊字符(可能在纯文本中出现)转换为HTML实体。

这是一个常见的问题,但是......

结果字符串是EMAILs的Html来源

所以我担心是否应该在转换过程中采取具体措施。

我知道电子邮件客户端呈现HTML的方式存在一些差异和不一致。

另外,我经常阅读的经验法则是像你在2001年一样写你的HTML

转化任务是htmlspecialchars 吗?

我还应该设置哪些标志?

通常我会使用:

$html = htmlspecialchars( $text, ENT_QUOTES, 'UTF-8' );

我应该使用ENT_QUOTES | ENT_HTML401吗?

1 个答案:

答案 0 :(得分:3)

简而言之,这取决于您是否要发送 UTF-8电子邮件或ASCII电子邮件

UTF-8电子邮件 - 只是htmlspecialchars罚款:

// We're telling it that $text is UTF-8 (+see below about control chars)
$html = htmlspecialchars( $text, ENT_DISALLOWED, 'UTF-8' );

这将替换掉<,>,“和& for。。其他任何内容,如é,将直接通过不变(这很好,因为电子邮件本身也是UTF-8)。

ASCII电子邮件 - 您需要执行HTML 4.01实体换出(这是默认设置),但使用相同的ENT_DISALLOWED标记:

// Same again - see below about the flags:
$html = htmlentities( $text, ENT_DISALLOWED, 'UTF-8' );

这会交换尽可能多的实体,以确保像é这样的东西用ASCII表示(和& eacute;)。

哪一个更好?

此部分完全取决于您的受众群体以及您希望与之互动的电子邮件客户端类型。简要介绍历史应该可以帮助您做出决定!

直到大约2006年,绝大多数网络都是ASCII。命名字符实体,例如& eacute;存在让网页支持更广泛的unicode代码点,以及显示对HTML很重要的字符。这是第一个问题:对UTF-8电子邮件的支持可能不完整

如果您要与老客户进行广泛报道,那么发送ASCII电子邮件是一种更安全的选择。这意味着您需要将超出ASCII范围的所有unicode代码点转换为ASCII兼容表示(html实体)。从根本上说,这是针对老客户的,所以使用ENT_HTML5 - 大大扩展的实体集 - 在这里毫无意义。

然而这是另一个问题 - 较旧的HTML 4.01实体集代表的unicode代码点要少得多,因此如果您希望以多种语言发送文本,那么您很可能需要改为发送UTF-8电子邮件。

UTF-8与ASCII电子邮件自测题:

  • 我需要支持多种语言吗? UTF-8。
  • 我是否需要支持少数几种语言,但需要尽可能多的客户? ASCII。
  • 既不?如今,UTF-8是默认选择。

关于控制字符的注释(ENT_DISALLOWED)

重要的是要注意控制字符 - 特别是空字节 - 默认情况下不会由htmlentities或htmlspecialchars处理。在网络上呈现的空字节也因崩溃而臭名昭着,包括有点着名的Chrome a short URL containing one。我不确定有多少电子邮件客户端正确处理空字节,但我非常倾向于认为它们并不多。因此,ENT_DISALLOWED标志会将它们剥离出来并为您提供更安全的角色。