@@ -38,36 +38,27 @@ utf8.length = function utf8_length(string) {
38
38
* @returns {string } String read
39
39
*/
40
40
utf8 . read = function utf8_read ( buffer , start , end ) {
41
- var len = end - start ;
42
- if ( len < 1 )
41
+ if ( end - start < 1 ) {
43
42
return "" ;
44
- var parts = null ,
45
- chunk = [ ] ,
46
- i = 0 , // char offset
47
- t ; // temporary
48
- while ( start < end ) {
49
- t = buffer [ start ++ ] ;
50
- if ( t < 128 )
51
- chunk [ i ++ ] = t ;
52
- else if ( t > 191 && t < 224 )
53
- chunk [ i ++ ] = ( t & 31 ) << 6 | buffer [ start ++ ] & 63 ;
54
- else if ( t > 239 && t < 365 ) {
55
- t = ( ( t & 7 ) << 18 | ( buffer [ start ++ ] & 63 ) << 12 | ( buffer [ start ++ ] & 63 ) << 6 | buffer [ start ++ ] & 63 ) - 0x10000 ;
56
- chunk [ i ++ ] = 0xD800 + ( t >> 10 ) ;
57
- chunk [ i ++ ] = 0xDC00 + ( t & 1023 ) ;
58
- } else
59
- chunk [ i ++ ] = ( t & 15 ) << 12 | ( buffer [ start ++ ] & 63 ) << 6 | buffer [ start ++ ] & 63 ;
60
- if ( i > 8191 ) {
61
- ( parts || ( parts = [ ] ) ) . push ( String . fromCharCode . apply ( String , chunk ) ) ;
62
- i = 0 ;
63
- }
64
43
}
65
- if ( parts ) {
66
- if ( i )
67
- parts . push ( String . fromCharCode . apply ( String , chunk . slice ( 0 , i ) ) ) ;
68
- return parts . join ( "" ) ;
44
+
45
+ var str = "" ;
46
+ for ( var i = start ; i < end ; ) {
47
+ var t = buffer [ i ++ ] ;
48
+ if ( t <= 0x7F ) {
49
+ str += String . fromCharCode ( t ) ;
50
+ } else if ( t >= 0xC0 && t < 0xE0 ) {
51
+ str += String . fromCharCode ( ( t & 0x1F ) << 6 | buffer [ i ++ ] & 0x3F ) ;
52
+ } else if ( t >= 0xE0 && t < 0xF0 ) {
53
+ str += String . fromCharCode ( ( t & 0xF ) << 12 | ( buffer [ i ++ ] & 0x3F ) << 6 | buffer [ i ++ ] & 0x3F ) ;
54
+ } else if ( t >= 0xF0 ) {
55
+ var t2 = ( ( t & 7 ) << 18 | ( buffer [ i ++ ] & 0x3F ) << 12 | ( buffer [ i ++ ] & 0x3F ) << 6 | buffer [ i ++ ] & 0x3F ) - 0x10000 ;
56
+ str += String . fromCharCode ( 0xD800 + ( t2 >> 10 ) ) ;
57
+ str += String . fromCharCode ( 0xDC00 + ( t2 & 0x3FF ) ) ;
58
+ }
69
59
}
70
- return String . fromCharCode . apply ( String , chunk . slice ( 0 , i ) ) ;
60
+
61
+ return str ;
71
62
} ;
72
63
73
64
/**
0 commit comments