Проблема с символом фунта в mailto: ссылка - PullRequest
2 голосов
/ 13 октября 2011

В моем приложении ASP.NET MVC я создаю ссылку mailto, где предмет и тело содержат символ фунта £.

Похоже, что это работает в большинстве случаев, но некоторые пользователи с Outlook 2003 / Chrome сообщают, что при нажатии на ссылку символ фунта отображается как £, что, как мне кажется, интерпретирует строку UTF-8 как ascii / windows-1252 / что угодно и т.д.

Я не уверен, как мне это закодировать. В настоящее время я использую следующее:

public static HtmlString EncodeMailTo(this HtmlHelper hlp, string val)
{
  var encoded = HttpUtility.UrlEncode(val).Replace("+", "%20");
  return new HtmlString(encoded);
}

и в представлении:

<a href="mailto:?subject=@(Html.EncodeMailTo(Model.Offer.Heading))&body=@(Html.EncodeMailTo(Model.Offer.Requirement))" >
    Link
</a>

Есть ли способ, которым я могу преобразовать это в другую кодировку (например, Windows-1252) перед UrlEncoding это? Я попытался преобразовать кодировку строки и затем передать это и кодировку, используемую в UrlEncode, но получить? тогда вместо символов £.

Ответы [ 3 ]

3 голосов
/ 13 октября 2011

Вы не найдете ни одного ответа, который решит эту проблему для всех браузеров / почтовых клиентов. Использование &pound; в соответствии с предложением Matt Fellows может работать на некоторых клиентах в этом случае. Однако вы столкнетесь с проблемами с другими символами, которые не имеют именованного объекта html, или с браузерами / почтовыми клиентами, которые не обрабатывают объекты правильно.

Еще более раздражающим является то, что если вы исправите его для одного настроенного браузера / электронной почты (например, с помощью Windows-1252), это может привести к поломке клиентов с помощью UTF-8.

В конце концов, единственное реальное решение - для браузеров и почтовых клиентов перейти на UTF-8, см. Как избежать международного mailto maelstrom .

2 голосов
/ 13 октября 2011

Попробуйте сознательно кодировать как &pound;

public static HtmlString EncodeMailTo(this HtmlHelper hlp, string val)
{
  var encoded = HttpUtility.UrlEncode(val).Replace("+", "%20").Replace("%C2%A3", "&pound;");

  return new HtmlString(encoded);
}

Символ £ не является частью основного набора символов ASCII. Таким образом, ASCII не будет интерпретировать это правильно.

0 голосов
/ 13 октября 2011

Улучшение ответа Мэтта Феллоу + 1

var encoded = HttpUtility.UrlEncode(HttpUtility.HtmlEncode(val));
...