diff --git a/c_src/utf8.c b/c_src/utf8.c index 53fc1b5..3ac65cb 100644 --- a/c_src/utf8.c +++ b/c_src/utf8.c @@ -234,7 +234,7 @@ unicode_uescape(int val, char* p) n = val - 0x10000; p[0] = '\\'; p[1] = 'u'; - if(int_to_hex((0xD800 | ((n << 10) & 0x03FF)), p+2) < 0) { + if(int_to_hex((0xD800 | ((n >> 10) & 0x03FF)), p+2) < 0) { return -1; } p[6] = '\\'; diff --git a/test/004-strings.t b/test/004-strings.t index 8396bbd..99852a3 100755 --- a/test/004-strings.t +++ b/test/004-strings.t @@ -6,7 +6,7 @@ main([]) -> code:add_pathz("ebin"), code:add_pathz("test"), - etap:plan(83), + etap:plan(87), util:test_good(good()), util:test_good(uescaped(), [uescape]), util:test_errors(errors()), @@ -36,6 +36,14 @@ uescaped() -> { <<"\"\\u8CA8\\u5481\\u3002\\u0091\\u0091\"">>, <<232,178,168,229,146,129,227,128,130,194,145,194,145>> + }, + { + <<"\"\\uD834\\uDD1E\"">>, + <<240, 157, 132, 158>> + }, + { + <<"\"\\uD83D\\uDE0A\"">>, + <<240, 159, 152, 138>> } ].