|
1 | | -/*! binarypack.js build:0.0.6, development. Copyright(c) 2012 Eric Zhang <eric@ericzhang.com> MIT Licensed */ |
| 1 | +/*! binarypack.js build:0.0.7, development. Copyright(c) 2012 Eric Zhang <eric@ericzhang.com> MIT Licensed */ |
2 | 2 | (function(exports){ |
3 | 3 | var binaryFeatures = {}; |
4 | 4 | binaryFeatures.useBlobBuilder = (function(){ |
@@ -62,11 +62,11 @@ exports.BinaryPack = { |
62 | 62 | unpack: function(data){ |
63 | 63 | var unpacker = new Unpacker(data); |
64 | 64 | return unpacker.unpack(); |
65 | | - }, |
66 | | - pack: function(data, utf8){ |
67 | | - var packer = new Packer(utf8); |
| 65 | + }, |
| 66 | + pack: function(data){ |
| 67 | + var packer = new Packer(); |
68 | 68 | packer.pack(data); |
69 | | - var buffer = packer.getBuffer(); |
| 69 | + var buffer = packer.getBuffer(); |
70 | 70 | return buffer; |
71 | 71 | } |
72 | 72 | }; |
@@ -309,8 +309,7 @@ Unpacker.prototype.read = function(length){ |
309 | 309 | } |
310 | 310 | } |
311 | 311 |
|
312 | | -function Packer(utf8){ |
313 | | - this.utf8 = utf8; |
| 312 | +function Packer(){ |
314 | 313 | this.bufferBuilder = new BufferBuilder(); |
315 | 314 | } |
316 | 315 |
|
@@ -392,13 +391,8 @@ Packer.prototype.pack_bin = function(blob){ |
392 | 391 | } |
393 | 392 |
|
394 | 393 | Packer.prototype.pack_string = function(str){ |
395 | | - var length; |
396 | | - if (this.utf8) { |
397 | | - var blob = new Blob([str]); |
398 | | - length = blob.size; |
399 | | - } else { |
400 | | - length = str.length; |
401 | | - } |
| 394 | + var length = utf8Length(str); |
| 395 | + |
402 | 396 | if (length <= 0x0f){ |
403 | 397 | this.pack_uint8(0xb0 + length); |
404 | 398 | } else if (length <= 0xffff){ |
@@ -562,5 +556,19 @@ Packer.prototype.pack_int64 = function(num){ |
562 | 556 | this.bufferBuilder.append((low & 0x0000ff00) >>> 8); |
563 | 557 | this.bufferBuilder.append((low & 0x000000ff)); |
564 | 558 | } |
| 559 | + |
| 560 | +function _utf8Replace(m){ |
| 561 | + var code = m.charCodeAt(0); |
| 562 | + |
| 563 | + if(code <= 0x7ff) return '00'; |
| 564 | + if(code <= 0xffff) return '000'; |
| 565 | + if(code <= 0x1fffff) return '0000'; |
| 566 | + if(code <= 0x3ffffff) return '00000'; |
| 567 | + return '000000'; |
| 568 | +} |
| 569 | + |
| 570 | +function utf8Length(str){ |
| 571 | + return str.replace(/[^\u0000-\u007F]/g, _utf8Replace).length; |
| 572 | +} |
565 | 573 |
|
566 | 574 | })(this); |
0 commit comments