MSExchange URL encoding

I am writing a PHP service to query an Exchange server via WebDAV. This service has been live for roughly a month with no issues, but experienced a hiccup today when an email with the following subject line arrived in the mailbox:

FW: Daily Approval Report: Vendor/Master 007297

The message is stored in the file "FW: Daily Approval Report: Vendor/Master 007297.EML" and is referenced through a url as:


I had been using the PHP rawurlencode() function to translate the message filename to its URL counterpart, but in this case rawurlencode() returns a mismatched string:


I'm no guru with Exchange and do not know how to match it's encoding. Can someone tell me if there is a mapping I can use to write my own function? I assume simply replacing / with \_xF8FF\_ and skipping colons will lead to chasing down this error again a month from now, but Google hasn't been helpful producing a full list of exceptions.


I've googled around a bit, but I haven't been able to find the complete reference of characters that you're looking for. The only thing that I've discovered is that the following five characters have a special encoding in Exchange:

    <li>Forward slash '/' is encoded as _xF8FF_</li> <li>Question mark '?' is encoded as _x003F_</li> <li>Backslash '\' is encoded as _xF8FE_</li> <li>Tilde '~' is encoded as _x007E_</li> <li>Euro symbol '€' is encoded as _x0080_</li> </ul>

    Maybe it could help to have a look at the source of the Ximian Connector for Microsoft Exchange, and more precisely at the "e2k_uri_append_encoded" function, at line 280. The Ximian Connector enables Ximian Evolution to function as a Microsoft Exchange client by communicating with Microsoft Exchange servers through the WebDAV protocol, so it has to deal exactly with the same problem you have encountered.


    Which Exchange Server do you use? Keep in mind that WebDAV is not supported anymore. ES2007 supports WebDAV and Exchange Web Services. ES2010 supportes only Exchange Web Services. However, encoding is fixed ;-)


  • USPS API - After creating labels retrieving Tracking Number C#
  • How to pass filename to StandardInput (Process) in C#?
  • Ideas for storing e-mail messages in a Delphi client server application
  • IMAP- Parsing original headers from a bounced mail
  • urlencode doesn't work in PHP (localhost)
  • regexp_split_to_array, spliiting on '|'
  • Cartesian power (a special Cartesian product) — choose elements from array, in repeatable style
  • MSExchange URL encoding
  • Removed sensitive file from GitHub history, but I can still access it [duplicate]
  • PDO not binding placeholders
  • Storing large decimal numbers in Java
  • Addresses of Delphi and C++ WinAPI functions differ when they shouldn't
  • How do I install these PHP extensions on Ubuntu?
  • Nginx rewrite equivalent to Apache RewriteRule that converts URL params into QueryString key/value p
  • d3.js: why is d3.geo.path() giving NaN?
  • Request response issues in biztalk
  • uml Composition relationships to RDF and OWL
  • how to upload multiple files in c# windows application
  • D3 get axis values on zoom event
  • How to revert to previous XCode version?
  • How to install a .deb file on a jailbroken iphone programmatically?
  • Handling un-mapped Rest path
  • Circular dependency while pushing http interceptor
  • AngularJs get employee from factory
  • Error creating VM instance in Google Compute Engine
  • How to set the response of a form post action to a iframe source?
  • Change div Background jquery
  • reshape alternating columns in less time and using less memory
  • Binding checkboxes to object values in AngularJs
  • Net Present Value in Excel for Grouped Recurring CF
  • jQuery Masonry / Isotope and fluid images: Momentary overlap on window resize
  • How to load view controller without button in storyboard?