- wchar_t ch = widebuf[i];
- /* We only deal with 16-bit wide chars */
- if ((ch&0xF800) == 0xD800) ch = '.';
+ unsigned long ch = widebuf[i];
+
+ if ((ch & 0xF800) == 0xD800) {
+#ifdef PLATFORM_IS_UTF16
+ if (i+1 < len) {
+ unsigned long ch2 = widebuf[i+1];
+ if ((ch & 0xFC00) == 0xD800 &&
+ (ch2 & 0xFC00) == 0xDC00) {
+ ch = 0x10000 + ((ch & 0x3FF) << 10) + (ch2 & 0x3FF);
+ i++;
+ }
+ } else
+#endif
+ {
+ /* Unrecognised UTF-16 sequence */
+ ch = '.';
+ }
+ }