]> zoso.dev Git - buffer.git/commitdiff
Fix fatal error of surrogte pair
authorKoki Takahashi <hakatasiloving@gmail.com>
Thu, 12 Nov 2015 09:20:25 +0000 (18:20 +0900)
committerKoki Takahashi <hakatasiloving@gmail.com>
Thu, 12 Nov 2015 09:20:25 +0000 (18:20 +0900)
Current implementation of surrogate pair doesn't take codepoints over
U+20000 into consideration. This is invalid since original specification
of UTF-16 is valid until U+10FFFF.

index.js
test/from-string.js

index 8645ca48c6910d9d1539e830eb3a4f4a71de421d..485705477a7d3cbe6801a5089cbbebf8729cf70b 100644 (file)
--- a/index.js
+++ b/index.js
@@ -1465,7 +1465,7 @@ function utf8ToBytes (string, units) {
       }
 
       // valid surrogate pair
-      codePoint = leadSurrogate - 0xD800 << 10 | codePoint - 0xDC00 | 0x10000
+      codePoint = (leadSurrogate - 0xD800 << 10 | codePoint - 0xDC00) + 0x10000
     } else if (leadSurrogate) {
       // valid bmp char, but last char was a lead
       if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)
index 349d261aedc64b21b7c9ccc903d9aabf5758bae9..e25db269971b92f4e3f91c79e8700873590198a9 100644 (file)
@@ -9,6 +9,13 @@ test('detect utf16 surrogate pairs', function (t) {
   t.end()
 })
 
+test('detect utf16 surrogate pairs over U+20000 until U+10FFFF', function (t) {
+  var text = '\uD842\uDFB7' + '\uD93D\uDCAD' + '\uDBFF\uDFFF'
+  var buf = new B(text)
+  t.equal(text, buf.toString())
+  t.end()
+})
+
 test('replace orphaned utf16 surrogate lead code point', function (t) {
   var text = '\uD83D\uDE38' + '\uD83D' + '\uD83D\uDC4D'
   var buf = new B(text)