]> git.kaiwu.me - nginx.git/commitdiff
Win32: support for UTF-16 surrogate pairs (ticket #457).
authorMaxim Dounin <mdounin@mdounin.ru>
Fri, 3 Jan 2014 23:32:15 +0000 (03:32 +0400)
committerMaxim Dounin <mdounin@mdounin.ru>
Fri, 3 Jan 2014 23:32:15 +0000 (03:32 +0400)
src/os/win32/ngx_files.c

index c1c749e3651d37609b031a07069464cc72902bd1..32e28b5d472d00e65386c359ac2d16a5dfa087ea 100644 (file)
@@ -799,13 +799,25 @@ ngx_utf8_to_utf16(u_short *utf16, u_char *utf8, size_t *len)
             continue;
         }
 
+        if (u + 1 == last) {
+            *len = u - utf16;
+            break;
+        }
+
         n = ngx_utf8_decode(&p, 4);
 
-        if (n > 0xffff) {
+        if (n > 0x10ffff) {
             ngx_set_errno(NGX_EILSEQ);
             return NULL;
         }
 
+        if (n > 0xffff) {
+            n -= 0x10000;
+            *u++ = (u_short) (0xd800 + (n >> 10));
+            *u++ = (u_short) (0xdc00 + (n & 0x03ff));
+            continue;
+        }
+
         *u++ = (u_short) n;
     }
 
@@ -838,12 +850,19 @@ ngx_utf8_to_utf16(u_short *utf16, u_char *utf8, size_t *len)
 
         n = ngx_utf8_decode(&p, 4);
 
-        if (n > 0xffff) {
+        if (n > 0x10ffff) {
             free(utf16);
             ngx_set_errno(NGX_EILSEQ);
             return NULL;
         }
 
+        if (n > 0xffff) {
+            n -= 0x10000;
+            *u++ = (u_short) (0xd800 + (n >> 10));
+            *u++ = (u_short) (0xdc00 + (n & 0x03ff));
+            continue;
+        }
+
         *u++ = (u_short) n;
     }