PHP:将特殊字符转换为电子邮件 html 来源的 HTML 实体的正确方法
PHP: proper way to convert special characters to HTML entities for email's html source
我在一个字符串中有 UTF-8 文本(我们称之为 "plain text"),我需要 注入 该文本到 HTML 代码中。
我正在使用 htmlspecialchars 将特殊字符(可能出现在纯文本中)转换为 HTML 个实体。
这是一个常见问题,但是....
结果字符串是 Html EMAIL 的来源
所以我担心转换过程中是否应该采取具体措施。
我知道电子邮件客户端呈现的方式存在一些差异和不一致 html。
另外一个我经常读到的经验法则是写你的HTML就像你在 2001 年一样
htmlspecialchars
适合转换任务吗?
我还应该设置哪些标志?
通常我使用:
$html = htmlspecialchars( $text, ENT_QUOTES, 'UTF-8' );
我应该使用 ENT_QUOTES | ENT_HTML401
吗?
简而言之,这取决于您要发送 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 表示(如 é ;)。
哪个更好?
这部分完全取决于您的受众以及您希望与之交互的电子邮件客户端的类型。简要回顾一下历史应该可以帮助您做出决定!
直到大约 2006 年,绝大多数网络都是 ASCII。命名字符实体,例如 é ;存在是为了让网页支持更广泛的 unicode 代码点,以及显示对 HTML 很重要的字符。这是第一个问题:对 UTF-8 电子邮件的支持可能是不完整的。
如果您要广泛覆盖年长的客户,那么发送 ASCII 电子邮件是一个更安全的选择。这意味着您需要将所有超出 ASCII 范围的 unicode 代码点转换为 ASCII 兼容表示(html 实体)。从根本上说,这是针对较老的客户,因此使用 ENT_HTML5 - 大大扩展的实体集 - 在这里没有任何意义。
但是 这是另一个问题 - 较旧的 HTML 4.01 实体集代表的 unicode 代码点要少得多,因此如果您希望发送范围广泛的文本的语言,那么您很可能需要发送一封 UTF-8 电子邮件。
UTF-8 与 ASCII 电子邮件 self-test 问题:
- 我需要支持多种语言吗? UTF-8.
- 我是否需要支持少数语言但尽可能多的客户端? ASCII.
- 也没有? UTF-8 是目前的默认选择。
关于控制字符的注意事项(ENT_DISALLOWED)
重要的是要注意控制字符——尤其是空字节——默认情况下不会被 htmlentities 或 htmlspecialchars 处理。出现在网络上的空字节也因崩溃而臭名昭著,包括有点著名的 Chrome 和 a short URL containing one。我不确定有多少电子邮件客户端正确处理了空字节,但我非常倾向于认为它们并不多。因此,ENT_DISALLOWED
标志会将它们去除并为您添加一个更安全的字符。
我在一个字符串中有 UTF-8 文本(我们称之为 "plain text"),我需要 注入 该文本到 HTML 代码中。
我正在使用 htmlspecialchars 将特殊字符(可能出现在纯文本中)转换为 HTML 个实体。
这是一个常见问题,但是....
结果字符串是 Html EMAIL 的来源
所以我担心转换过程中是否应该采取具体措施。
我知道电子邮件客户端呈现的方式存在一些差异和不一致 html。
另外一个我经常读到的经验法则是写你的HTML就像你在 2001 年一样
htmlspecialchars
适合转换任务吗?
我还应该设置哪些标志?
通常我使用:
$html = htmlspecialchars( $text, ENT_QUOTES, 'UTF-8' );
我应该使用 ENT_QUOTES | ENT_HTML401
吗?
简而言之,这取决于您要发送 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 表示(如 é ;)。
哪个更好?
这部分完全取决于您的受众以及您希望与之交互的电子邮件客户端的类型。简要回顾一下历史应该可以帮助您做出决定!
直到大约 2006 年,绝大多数网络都是 ASCII。命名字符实体,例如 é ;存在是为了让网页支持更广泛的 unicode 代码点,以及显示对 HTML 很重要的字符。这是第一个问题:对 UTF-8 电子邮件的支持可能是不完整的。
如果您要广泛覆盖年长的客户,那么发送 ASCII 电子邮件是一个更安全的选择。这意味着您需要将所有超出 ASCII 范围的 unicode 代码点转换为 ASCII 兼容表示(html 实体)。从根本上说,这是针对较老的客户,因此使用 ENT_HTML5 - 大大扩展的实体集 - 在这里没有任何意义。
但是 这是另一个问题 - 较旧的 HTML 4.01 实体集代表的 unicode 代码点要少得多,因此如果您希望发送范围广泛的文本的语言,那么您很可能需要发送一封 UTF-8 电子邮件。
UTF-8 与 ASCII 电子邮件 self-test 问题:
- 我需要支持多种语言吗? UTF-8.
- 我是否需要支持少数语言但尽可能多的客户端? ASCII.
- 也没有? UTF-8 是目前的默认选择。
关于控制字符的注意事项(ENT_DISALLOWED)
重要的是要注意控制字符——尤其是空字节——默认情况下不会被 htmlentities 或 htmlspecialchars 处理。出现在网络上的空字节也因崩溃而臭名昭著,包括有点著名的 Chrome 和 a short URL containing one。我不确定有多少电子邮件客户端正确处理了空字节,但我非常倾向于认为它们并不多。因此,ENT_DISALLOWED
标志会将它们去除并为您添加一个更安全的字符。