]> source.dussan.org Git - tigervnc.git/commitdiff
Fix UTF-16 encoding/decoding of high code points
authorPierre Ossman <ossman@cendio.se>
Mon, 5 Oct 2020 14:01:55 +0000 (16:01 +0200)
committerPierre Ossman <ossman@cendio.se>
Mon, 5 Oct 2020 14:01:55 +0000 (16:01 +0200)
Everything outside of BMP was handled incorrectly and was coded as
completely different code points.

common/rfb/util.cxx
tests/unit/unicode.cxx

index 00e2831ce46be7f130f16e1c6f95e32677fcb305..85b668fc69aa51a659119eda12ec3ca1995d522f 100644 (file)
@@ -315,8 +315,9 @@ namespace rfb {
       *dst++ = L'\0';
       return 1;
     } else if (src < 0x110000) {
-      *dst++ = 0xd800 | ((src >> 10) & 0x07ff);
-      *dst++ = 0xdc00 | (src & 0x07ff);
+      src -= 0x10000;
+      *dst++ = 0xd800 | ((src >> 10) & 0x03ff);
+      *dst++ = 0xdc00 | (src & 0x03ff);
       *dst++ = L'\0';
       return 2;
     } else {
@@ -358,7 +359,7 @@ namespace rfb {
       return 1;
     }
 
-    *dst = 0x10000 | ((*dst & 0x03ff) << 10);
+    *dst = 0x10000 + ((*dst & 0x03ff) << 10);
     *dst |= *src & 0x3ff;
 
     return 2;
index 748f43471380c41f6bd12260bf46093c177408dc..4bcb65b3c403675f8c07323b76b0b831ab460018 100644 (file)
@@ -50,6 +50,8 @@ struct _ucs4utf16 ucs4utf16[] = {
     { 0x0061, L"a" },
     { 0x00f6, L"\xf6" },
     { 0x263a, L"\x263a" },
+    { 0x1f638, L"\xd83d\xde38" },
+    { 0x2d006, L"\xd874\xdc06" },
     { 0xfffd, L"\xdc40\xdc12" },
     { 0x110200, L"\xfffd" },
 };
@@ -58,6 +60,8 @@ struct _utf8utf16 utf8utf16[] = {
     { "abc",                                                L"abc" },
     { "\xc3\xa5\xc3\xa4\xc3\xb6",                           L"\xe5\xe4\xf6" },
     { "\xe2\x98\xb9\xe2\x98\xba\xe2\x98\xbb",               L"\x2639\x263a\x263b" },
+    { "\xf0\x9f\x98\xb8\xf0\x9f\x99\x81\xf0\x9f\x99\x82",   L"\xd83d\xde38\xd83d\xde41\xd83d\xde42" },
+    { "\xf0\xad\x80\x86\xf0\xad\x80\x88",                   L"\xd874\xdc06\xd874\xdc08" },
     { "\xef\xbf\xbd\xc3\xa5",                               L"\xd840\xe5" },
 };