发送保留重音字符的邮件时遇到问题。通过阅读一些页面和前面提到的问题的答案,我能够找到一个有效的解决方案。
我对以下代码没有任何问题,它可以正常工作(即我在我使用的eMail客户端中看到重音字符)。它使用PEAR php库。但是,这段代码只对英语有用,我稍后会解释。
...
$headers['From'] = "info@website.it";
$headers['Subject'] = 'Request';
$headers['Reply-To'] = $sanitized_email;
$headers["Content-Type"] = 'text/html; charset=UTF-8';
$headers["Content-Transfer-Encoding"]= "8bit";
$host= _CMS_MAIL_SERVER;
$username = "info@website.it";
$password = "pass";
$crlf = "\n";
$mime = new Mail_mime(array('eol' => $crlf));
$html_body = ...;
// read $html_body from file
// substitute some %tags% in $html_body
$mime->setHTMLBody($html_body);
$mimeparams['text_encoding']="8bit";
$mimeparams['text_charset']="UTF-8";
$mimeparams['html_charset']="UTF-8";
$mimeparams['head_charset']="UTF-8";
$mimebody = $mime->get($mimeparams);
$hdrs = $mime->headers($headers);
$smtp = Mail::factory('smtp', array ('host' => $host, 'auth' => true, 'username' => $username, 'password' => $password));
$mail_res = $smtp->send($recipients, $hdrs, $mimebody);
...
在$ html_body中,我有一些标签,我需要用日期或strftime(..)返回的时间和日期值替换。由于默认语言环境是英语,为了有意大利语日期和时间,我需要在调用strftime(...)之前设置语言环境。
如果我添加这一行:
setlocale(LC_TIME, "it_IT");
邮件客户端无法正确显示重音字符。更多细节:strftime返回的重音字符正确显示(例如lunedì),而通过表单字段提交的重音字符则不是。
我做了一些研究,以了解如何纠正错误,但我找不到任何解决方案。此外,我不清楚LC_TIME上的setlocale与重音字符之间的关系是什么。
有没有人可以帮助我?
答案 0 :(得分:0)
我解决了这个问题。
setlocale(...)即使不需要也会切换字符编码。
在这种情况下,setlocale(LC_TIME,“it_IT”)从UTF-8切换到ISO-8859-1,接收页面使用UTF-8。
使用UTF-8时,设置区域设置的正确方法是: setlocale(LC_TIME,“it_IT.UTF-8”)。
很明显这个问题与字符编码有关,但是如果使用的编码对于语言来说是正确的,那么setlocale不应该改变语言环境(或者它应该吗?)。