【问题标题】:PHP: proper way to convert special characters to HTML entities for email's html sourcePHP:将特殊字符转换为电子邮件 html 源的 HTML 实体的正确方法
【发布时间】:2017-01-21 07:55:29
【问题描述】:

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

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

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

生成的字符串是 EMAIL 的 Html 源

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

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

我经常阅读的一条经验法则是像 2001 年一样编写 HTML

htmlspecialchars适合转换任务吗?

还有我应该设置哪些标志?

我通常使用:

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

我应该使用ENT_QUOTES | ENT_HTML401 吗?

【问题讨论】:

  • htmlspecialchars HTML 转换为纯文本。你的问题意味着你想要相反的,所以你会使用html_entity_decode
  • @apokryfos 可能我不清楚:我有类似 a > b 的文本,并且字符串中的字符可能需要在字符串用作 HTML 之前转换为 html 实体:a > b。所以htmlspecialchars 实际上是要走的路,因为手册指出htmlspecialchars — Convert special characters to HTML entities
  • 是的,我可能对您的措辞感到困惑。如果我需要转换的不仅仅是基本的 HTML 特殊字符,我通常会使用 htmlentities。它仍然使用相同的选项,因此当您还需要转换 '"&<> 以外的字符时使用它

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


【解决方案1】:

简而言之,这取决于您要发送 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' );

这将为您换出 、" 和 &。其他任何内容,例如 é,都将直接通过而不改变(这很好,因为电子邮件本身也是 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 标志会将它们去掉,并为您添加一个更安全的字符。

【讨论】:

  • @Community 原文是正确的 - 我将编辑文本以使其更清晰。
猜你喜欢
  • 2017-07-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-26
  • 2011-01-31
相关资源
最近更新 更多