Mercurial > hg > nginx
changeset 5501:1cd23ca84a9b
Win32: support for UTF-16 surrogate pairs (ticket #457).
author | Maxim Dounin <mdounin@mdounin.ru> |
---|---|
date | Sat, 04 Jan 2014 03:32:15 +0400 |
parents | 6a3ab6fdd70f |
children | 4aa64f695031 |
files | src/os/win32/ngx_files.c |
diffstat | 1 files changed, 22 insertions(+), 3 deletions(-) [+] |
line wrap: on
line diff
--- a/src/os/win32/ngx_files.c Sat Jan 04 03:32:10 2014 +0400 +++ b/src/os/win32/ngx_files.c Sat Jan 04 03:32:15 2014 +0400 @@ -799,11 +799,23 @@ continue; } + if (u + 1 == last) { + *len = u - utf16; + break; + } + n = ngx_utf8_decode(&p, 4); + if (n > 0x10ffff) { + ngx_set_errno(NGX_EILSEQ); + return NULL; + } + if (n > 0xffff) { - ngx_set_errno(NGX_EILSEQ); - return NULL; + n -= 0x10000; + *u++ = (u_short) (0xd800 + (n >> 10)); + *u++ = (u_short) (0xdc00 + (n & 0x03ff)); + continue; } *u++ = (u_short) n; @@ -838,12 +850,19 @@ 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; }