@@ -9,20 +9,20 @@ var utf8 = exports;
99
1010/**
1111 * Calculates the UTF8 byte length of a string.
12- * @param {string } str String
12+ * @param {string } string String
1313 * @returns {number } Byte length
1414 */
15- utf8 . length = function length ( str ) {
16- var strlen = str . length >>> 0 ;
15+ utf8 . length = function length ( string ) {
16+ var strlen = string . length >>> 0 ;
1717 var len = 0 ,
1818 c = 0 ;
1919 for ( var i = 0 ; i < strlen ; ++ i ) {
20- c = str . charCodeAt ( i ) ;
20+ c = string . charCodeAt ( i ) ;
2121 if ( c < 128 )
2222 len += 1 ;
2323 else if ( c < 2048 )
2424 len += 2 ;
25- else if ( ( c & 0xFC00 ) === 0xD800 && ( str . charCodeAt ( i + 1 ) & 0xFC00 ) === 0xDC00 ) {
25+ else if ( ( c & 0xFC00 ) === 0xD800 && ( string . charCodeAt ( i + 1 ) & 0xFC00 ) === 0xDC00 ) {
2626 ++ i ;
2727 len += 4 ;
2828 } else
@@ -31,64 +31,67 @@ utf8.length = function length(str) {
3131 return len ;
3232} ;
3333
34- /**
35- * Writes a string as UTF8 bytes.
36- * @param {Uint8Array } buf Destination buffer
37- * @param {number } pos Destination offset
38- * @param {string } str Source string
39- * @returns {number } Bytes written
40- */
41- utf8 . write = function ( buf , pos , str ) {
42- var start = pos ;
43- for ( var i = 0 ; i < str . length ; ++ i ) {
44- var c1 = str . charCodeAt ( i ) , c2 ;
45- if ( c1 < 128 ) {
46- buf [ pos ++ ] = c1 ;
47- } else if ( c1 < 2048 ) {
48- buf [ pos ++ ] = c1 >> 6 | 192 ;
49- buf [ pos ++ ] = c1 & 63 | 128 ;
50- } else if ( ( c1 & 0xFC00 ) === 0xD800 && ( ( c2 = str . charCodeAt ( i + 1 ) ) & 0xFC00 ) === 0xDC00 ) {
51- c1 = 0x10000 + ( ( c1 & 0x03FF ) << 10 ) + ( c2 & 0x03FF ) ;
52- ++ i ;
53- buf [ pos ++ ] = c1 >> 18 | 240 ;
54- buf [ pos ++ ] = c1 >> 12 & 63 | 128 ;
55- buf [ pos ++ ] = c1 >> 6 & 63 | 128 ;
56- buf [ pos ++ ] = c1 & 63 | 128 ;
57- } else {
58- buf [ pos ++ ] = c1 >> 12 | 224 ;
59- buf [ pos ++ ] = c1 >> 6 & 63 | 128 ;
60- buf [ pos ++ ] = c1 & 63 | 128 ;
61- }
62- }
63- return pos - start ;
64- } ;
65-
6634/**
6735 * Reads UTF8 bytes as a string.
68- * @param {Uint8Array } buf Source buffer
69- * @param {number } pos Source offset
70- * @param {number } len Source length
36+ * @param {Uint8Array } buffer Source buffer
37+ * @param {number } start Source start
38+ * @param {number } end Source end
7139 * @returns {string } String read
7240 */
73- utf8 . read = function ( buf , pos , len ) {
74- if ( len ) {
75- var out = [ ] ,
41+ utf8 . read = function ( buffer , start , end ) {
42+ var len = end - start ;
43+ if ( len > 0 ) {
44+ var string = [ ] ,
7645 i = 0 , // char offset
7746 t ; // temporary
78- while ( pos < len ) {
79- t = buf [ pos ++ ] ;
47+ while ( start < end ) {
48+ t = buffer [ start ++ ] ;
8049 if ( t < 128 )
81- out [ i ++ ] = t ;
50+ string [ i ++ ] = t ;
8251 else if ( t > 191 && t < 224 )
83- out [ i ++ ] = ( t & 31 ) << 6 | buf [ pos ++ ] & 63 ;
52+ string [ i ++ ] = ( t & 31 ) << 6 | buffer [ start ++ ] & 63 ;
8453 else if ( t > 239 && t < 365 ) {
85- t = ( ( t & 7 ) << 18 | ( buf [ pos ++ ] & 63 ) << 12 | ( buf [ pos ++ ] & 63 ) << 6 | buf [ pos ++ ] & 63 ) - 0x10000 ;
86- out [ i ++ ] = 0xD800 + ( t >> 10 ) ;
87- out [ i ++ ] = 0xDC00 + ( t & 1023 ) ;
54+ t = ( ( t & 7 ) << 18 | ( buffer [ start ++ ] & 63 ) << 12 | ( buffer [ start ++ ] & 63 ) << 6 | buffer [ start ++ ] & 63 ) - 0x10000 ;
55+ string [ i ++ ] = 0xD800 + ( t >> 10 ) ;
56+ string [ i ++ ] = 0xDC00 + ( t & 1023 ) ;
8857 } else
89- out [ i ++ ] = ( t & 15 ) << 12 | ( buf [ pos ++ ] & 63 ) << 6 | buf [ pos ++ ] & 63 ;
58+ string [ i ++ ] = ( t & 15 ) << 12 | ( buffer [ start ++ ] & 63 ) << 6 | buffer [ start ++ ] & 63 ;
9059 }
91- return String . fromCharCode . apply ( String , out . slice ( 0 , i ) ) ;
60+ return String . fromCharCode . apply ( String , string . slice ( 0 , i ) ) ;
9261 }
9362 return "" ;
9463} ;
64+
65+ /**
66+ * Writes a string as UTF8 bytes.
67+ * @param {string } string Source string
68+ * @param {Uint8Array } buffer Destination buffer
69+ * @param {number } offset Destination offset
70+ * @returns {number } Bytes written
71+ */
72+ utf8 . write = function ( string , buffer , offset ) {
73+ var start = offset ,
74+ c1 , // character 1
75+ c2 ; // character 2
76+ for ( var i = 0 ; i < string . length ; ++ i ) {
77+ c1 = string . charCodeAt ( i ) ;
78+ if ( c1 < 128 ) {
79+ buffer [ offset ++ ] = c1 ;
80+ } else if ( c1 < 2048 ) {
81+ buffer [ offset ++ ] = c1 >> 6 | 192 ;
82+ buffer [ offset ++ ] = c1 & 63 | 128 ;
83+ } else if ( ( c1 & 0xFC00 ) === 0xD800 && ( ( c2 = string . charCodeAt ( i + 1 ) ) & 0xFC00 ) === 0xDC00 ) {
84+ c1 = 0x10000 + ( ( c1 & 0x03FF ) << 10 ) + ( c2 & 0x03FF ) ;
85+ ++ i ;
86+ buffer [ offset ++ ] = c1 >> 18 | 240 ;
87+ buffer [ offset ++ ] = c1 >> 12 & 63 | 128 ;
88+ buffer [ offset ++ ] = c1 >> 6 & 63 | 128 ;
89+ buffer [ offset ++ ] = c1 & 63 | 128 ;
90+ } else {
91+ buffer [ offset ++ ] = c1 >> 12 | 224 ;
92+ buffer [ offset ++ ] = c1 >> 6 & 63 | 128 ;
93+ buffer [ offset ++ ] = c1 & 63 | 128 ;
94+ }
95+ }
96+ return offset - start ;
97+ } ;
0 commit comments