[英]Escape email subject line
我知道 email 主题不必转义,因为(据我所知)是 HTTP 标题而不是 HTML 文本。
所以写作è
在主题行内将 output è
给用户。
我想发送一些自动电子邮件,并且在某些语言中它们也包含一些非 ascii 字符。
由于我的主机集成编辑器(我有时用于快速编辑)不支持 UTF-8 编码,我更喜欢仅使用 ASCII 并且我总是转义所有内容( à
用于 HTML, \\xe0
用于 JS 等等......)
那么,有没有办法仅使用 ASCII 来逃避 email 主题,即使接收者确实支持 UTF-8?
&...;
是 HTML/XML 实体,与 email 无关。 您将无法可靠地将这些转换为所需的符号,我会认为任何将它们转换为错误的结果。
此外,没有“ASCII è”之类的东西。 “ASCII”不是真正的编码,“扩展 ASCII”是对 ISO8859 和/或 Microsoft cp12XX 编码的误用。 如果您的客户不能支持除了无重音的英文文本之外的任何内容,那么您只能使用这些。
也就是说,根据规范,虽然所有 email 标头都必须是 7 位安全的“ASCII”文本,但有规定对包含其他字符集中文本的 header 进行编码。 UTF、ISO、MS CP 等
function encode_subject($input, $charset, $method='B') {
switch($method) {
case 'B':
$encoded = base64_encode($input);
break;
case 'Q':
$encoded = quoted_printable_encode($input);
break;
default:
throw new Exception('Unknonw encoding method: ' . $method);
}
return sprintf('=?%s?%s?%s?=', $charset, $method, $encoded);
}
$input = 'Welcome to the fancy è club!'; // utf8
$utf8 = $input;
$iso8859_1 = mb_convert_encoding($input, 'iso-8859-1', 'utf-8');
$cp1252 = mb_convert_encoding($input, 'cp1252', 'utf-8');
var_dump(
$utf8,
encode_subject($utf8, 'utf-8', 'B'),
encode_subject($utf8, 'utf-8', 'Q'),
$iso8859_1,
encode_subject($iso8859_1, 'iso-8859-1', 'B'),
encode_subject($iso8859_1, 'iso-8859-1', 'Q'),
$cp1252,
encode_subject($cp1252, 'cp1252', 'B'),
encode_subject($cp1252, 'cp1252', 'Q')
);
Output:
string(29) "Welcome to the fancy è club!"
string(52) "=?utf-8?B?V2VsY29tZSB0byB0aGUgZmFuY3kgw6ggY2x1YiE=?="
string(45) "=?utf-8?Q?Welcome to the fancy =C3=A8 club!?="
string(28) "Welcome to the fancy � club!"
string(57) "=?iso-8859-1?B?V2VsY29tZSB0byB0aGUgZmFuY3kg6CBjbHViIQ==?="
string(47) "=?iso-8859-1?Q?Welcome to the fancy =E8 club!?="
string(28) "Welcome to the fancy � club!"
string(53) "=?cp1252?B?V2VsY29tZSB0byB0aGUgZmFuY3kg6CBjbHViIQ==?="
string(43) "=?cp1252?Q?Welcome to the fancy =E8 club!?="
因此,无论您发送电子邮件的字符集是什么,都可以使用它来编码主题。 如果您的收件人正在使用旧的、被破坏的邮件客户端,这些客户端无法正确解码他们可能说的语言的文本,那么他们有更大的问题与您无关。
UTF-8 无处不在,适用于一切。 2020 年不支持 UTF8 的任何东西都是有缺陷的,而不是您的问题。 除非您的目标市场是使用 Windows ME 或 2004 年的 Palm Pilot 的人,否则请使用 UTF-8。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.