2

我在发送保留重音字符的邮件时遇到问题。通过阅读一些页面和以前提出的问题的答案,我能够找到一个可行的解决方案(部分)。

我对以下代码没有问题,它可以正常工作(即我在我使用的电子邮件客户端中看到了重音字符)。它使用 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 中,我有一些需要用时间和日期值替换的标签,由 date 或 strftime(..) 返回。由于默认语言环境是英语,为了获得意大利语日期和时间,我需要在调用 strftime(...) 之前设置语言环境。

如果我添加这一行:

setlocale(LC_TIME, "it_IT");

邮件客户端无法正确显示重音字符。更多细节:strftime 返回的重音字符正确显示(例如lunedì),而通过表单字段提交的重音字符则不正确。

我进行了一些研究以了解如何纠正该错误,但我没有找到任何解决方案。此外,我不清楚 LC_TIME 上的 setlocale 和重音字符之间的关系是什么。

有谁能帮助我吗?

4

1 回答 1

2

我解决了这个问题。

setlocale(...) 切换字符编码,即使它不需要。

在这种情况下 setlocale(LC_TIME, "it_IT") 从 UTF-8 切换到 ISO-8859-1 并且接收页面使用 UTF-8。

使用 UTF-8 时,设置区域设置的正确方法是:setlocale(LC_TIME, "it_IT.UTF-8")。

很明显,问题与字符编码有关,但是如果使用的编码对于该语言来说是可以的(或者应该吗?),setlocale 不应该更改语言环境。

于 2012-05-03T14:03:37.180 回答