We had a customer who used CDO to create appointments and send meeting requests. Since they were operating in Europe, it wasn’t unusual for these items to have the Euro symbol (€) in the body of a meeting. When they would send the appointment, if the recipient was on Exchange 2007, all the Euro symbols would get replace with question marks.
What was happening? When you call .Send on an appointment using CDO, CDO builds a new meeting request message. It copied PR_BODY from the source appointment over to the request message. It doesn’t set a code page, so the default code page of Windows 1252 gets used, meaning the Euro is encoded as 0x80. When the message is received by Exchange 2007, it passes through the edge transport, where we process the meeting to create a tentative item on the recipient's calendar. This is where the trouble happens – we try to figure out the code page of the item. We settle on Windows 1252, which is correct, but we decide to map this to the character set ISO-8859-1, which is not quite correct. Windows 1252 and ISO-8859-1 are quite similar, but there are characters, such as the Euro, which are present in Windows 1252 but not in ISO-8859-1. We manage to read the Euro character from the source text and recognize it as the Unicode character U+20AC, but since this character isn’t present in the target code page, we write the question mark instead.
Now – if we had control over the meeting request CDO built, we could set the code page property (PR_INTERNET_CPID) to something like 1200, which fakes Exchange into keeping the Euro. However, the proper fix here is to adjust how Exchange interprets the data in the meeting request, specifically, mapping Windows 1252 to ISO-8859-15.
This is where Exchange 2007 SP1 Rollup 7 comes in. As described in this article, we’ve corrected how we map characters on inbound meeting requests, so all your Euro symbols should now be safe. If you’re receiving meeting requests with question marks in them, you should consider installing this rollup.