Проблема с символом фунта в mailto: ссылка

В моем приложении 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 ответа

Решение

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

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

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

Попробуйте сознательно кодировать как &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 не будет интерпретировать это правильно.

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

var encoded = HttpUtility.UrlEncode(HttpUtility.HtmlEncode(val));
Другие вопросы по тегам