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