Проблема с символом фунта в 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 ответа
Вы не найдете ни одного ответа, который решит эту проблему для всех браузеров / почтовых клиентов. С использованием £
как предполагает Мэтт Феллоуз, в этом случае он может работать с некоторыми клиентами. Однако вы столкнетесь с проблемами с другими символами, у которых нет именованного объекта html, или с браузерами / почтовыми клиентами, которые не обрабатывают объекты правильно.
Еще более раздражающим является то, что если вы исправите это для одного настроенного браузера / электронной почты (например, с помощью Windows-1252), то это может привести к поломке клиентов с помощью UTF-8.
В конце концов, единственное реальное решение - для браузеров и почтовых клиентов перейти на UTF-8, см. Избежание международного водоворота почты.
Попробуйте сознательно кодировать как £
public static HtmlString EncodeMailTo(this HtmlHelper hlp, string val)
{
var encoded = HttpUtility.UrlEncode(val).Replace("+", "%20").Replace("%C2%A3", "£");
return new HtmlString(encoded);
}
Символ £ не является частью базового набора символов ASCII. Таким образом, ASCII не будет интерпретировать это правильно.
Улучшение ответа Мэтта Феллоу +1
var encoded = HttpUtility.UrlEncode(HttpUtility.HtmlEncode(val));