WedX - журнал о программировании и компьютерных науках

Проблема с символом фунта в 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, но получить? вместо символов £ тогда.


  • mailto:?subject=You have won &pound;500! у меня работает с Chrome/Thunderbird, сейчас не могу протестировать другие комбинации, но, возможно, стоит попробовать 13.10.2011

Ответы:


1

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

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

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

13.10.2011

2

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

13.10.2011
  • Я попробую это. Однако ваш код не будет работать как есть, потому что символ £ уже будет закодирован к тому времени, когда ваш Replace() запустится. 13.10.2011
  • Извините - попробуйте заменить £ на %C2%A3 (URL-кодированный символ £) 13.10.2011

  • 3

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

    var encoded = HttpUtility.UrlEncode(HttpUtility.HtmlEncode(val));
    
    13.10.2011
  • Кажется, это не работает. Я получаю что-то вроде saving+of+a+minimum+of+&#163;5.99 при переходе по ссылке 13.10.2011
  • Новые материалы

    Как проанализировать работу вашего классификатора?
    Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

    Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
    Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

    Учебные заметки: создание моего первого пакета Node.js
    Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

    Забудьте о Matplotlib: улучшите визуализацию данных с помощью умопомрачительных функций Seaborn!
    Примечание. Эта запись в блоге предполагает базовое знакомство с Python и концепциями анализа данных. Привет, энтузиасты данных! Добро пожаловать в мой блог, где я расскажу о невероятных..

    ИИ в аэрокосмической отрасли
    Каждый полет – это шаг вперед к великой мечте. Чтобы это происходило в их собственном темпе, необходима команда астронавтов для погони за космосом и команда технического обслуживания..


    Для любых предложений по сайту: [email protected]