Как я могу использовать Unicode в протоколе «mailto»? - PullRequest
3 голосов
/ 01 февраля 2010

Я хочу запустить приложение электронной почты по умолчанию через функцию ShellExecute.

т.е. Я пишу что-то вроде этого:

ShellExecute (0, 'mailto: example@example.com? Subject = example & body = example', ...);

Как я могу кодировать неамериканские символы в теме и теле?

Я не могу использовать кодовую страницу ANSI по умолчанию, потому что символы могут быть любыми: китайские символы, кириллица или что-то еще.

P.S. Примечания:

  1. Я использую функцию ShellExecuteW.
  2. Оставление темы и тела "как есть" не будет работать (протестировано с почтовым клиентом Windows Live на Win7 и Outlook Express на WinXP).
  3. Кодировка субъекта как URLEncode (UTF8Encode (Subject)) будет работать для Почты Windows Live, но не будет работать для Outlook Express.
  4. URLEncode (UTF8Encode (Body)) не будет работать для обоих клиентов.

Ответы [ 2 ]

6 голосов
/ 01 февраля 2010

MAILTO: example@example.com Заголовок = пример и тела =% e5% 85% объявлений

Краткий ответ: нет . Символы должны быть в процентах, как определено RFC 3986 и его предшественниками. RFC 2368 определяет структуру URI mailto.

#include "windows.h"

int main() {
  ShellExecute(0, TEXT("open"),
    TEXT("mailto:example@example.com?subject=example&body=%e5%85%ad"),
    TEXT(""), NULL, SW_SHOWNORMAL);

  return 0;
}

Тело в этом случае - это символ CJK U + 516D (& # x516D;), закодированный как UTF-8 (E5 85 AD). Это правильно работает с Mozilla Thunderbird (вам может потребоваться установить дополнительные шрифты, если это не так).

Остальное зависит от того, как ваш пользовательский агент (почтовый клиент) интерпретирует URI. RFC 3986 обязывает UTF-8, но предыдущие спецификации этого не сделали. Пользовательский агент может неправильно интерпретировать данные, если они предшествуют RFC 3986, не были обновлены или поддерживают обратную совместимость с предыдущими реализациями.

Примечание: функции URLEncode обычно означают кодировку HTML application/x-www-form-urlencoded. Это, вероятно, приведет к замене пробелов на символы плюс.

Примечание 2: Я не в курсе состояния поддержки IRI в оболочке Windows, но, вероятно, стоит посмотреть. Тем не менее, некоторые символы в части запроса по-прежнему необходимо кодировать в процентах.

2 голосов
/ 01 февраля 2010

Интерпретация командной строки до запущенной программы.В зависимости от характера установленного почтового клиента, вы можете или не можете получить поддержку Unicode (в той или иной форме).Так что нет единого рецепта.Некоторые из них могут использовать командную строку ANSI (почему бы и нет?), Некоторые из них могут относиться к символам URLEncoded и т. Д.

Лучше всего обнаружить 3-4 популярных почтовых программы, прочитав реестр и настроив командулиния соответственно.Очень не элегантный и неполный по замыслу, но больше ничего не поделаешь.

...