lib/lib.js
function (view, offset, length) {
            // Tweak offset to remove the BOM (LE: FF FE / BE: FE FF)
            if (view.getUint16(offset) === 0xFFFE || view.getUint16(offset) === 0xFEFF) {
                offset += 2;
                length -= 2;
            }

            var buffer = view.buffer;

            // When offset happens to be an even number of octets, the array-buffer may be wrapped
            //  in a Uint16Array. In the event that it's _not_, an actual copy has to be made
            // (Note that Node <= 0.8 as well as IE <= 10 lack an ArrayBuffer#slice. TODO: shim it)
            if (offset % 2 === 1) {
                buffer = buffer.slice(offset, offset + length);
                offset = 0;
            }

            return String.fromCharCode.apply(null, new Uint16Array(buffer, offset, length / 2));
        }
function (view, offset, length) {
            // Tweak offset to remove the BOM (LE: FF FE / BE: FE FF)
            if (view.getUint16(offset) === 0xFFFE || view.getUint16(offset) === 0xFEFF) {
                offset += 2;
                length -= 2;
            }

            var buffer = view.buffer;

            // When offset happens to be an even number of octets, the array-buffer may be wrapped
            //  in a Uint16Array. In the event that it's _not_, an actual copy has to be made
            // (Note that Node <= 0.8 as well as IE <= 10 lack an ArrayBuffer#slice. TODO: shim it)
            if (offset % 2 === 1) {
                buffer = buffer.slice(offset, offset + length);
                offset = 0;
            }

            return String.fromCharCode.apply(null, new Uint16Array(buffer, offset, length / 2));
        }
function ( view , offset , length ) { // Tweak offset to remove the BOM (LE: FF FE / BE: FE FF) if ( view . getUint16 ( offset ) === 0xFFFE || view . getUint16 ( offset ) === 0xFEFF ) { offset += 2 ; length -= 2 ; } var buffer = view . buffer ; // When offset happens to be an even number of octets, the array-buffer may be wrapped //  in a Uint16Array. In the event that it's _not_, an actual copy has to be made // (Note that Node <= 0.8 as well as IE <= 10 lack an ArrayBuffer#slice. TODO: shim it) if ( offset % 2 === 1 ) { buffer = buffer . slice ( offset , offset + length ) ; offset = 0 ; } return String . fromCharCode . apply ( null , new Uint16Array ( buffer , offset , length / 2 ) ) ; }
UCS-2 (ISO/IEC 10646-1:1993, UCS-2) version of `readStr`. UCS-2 is the fixed-width two-byte subset of Unicode that can only express values inside the Basic Multilingual Plane (BMP). Note that this method is generally unsuitable for parsing non-trivial UTF-16 strings which may contain surrogate pairs. [This is only marginally related though as, according to ID3v2, all Unicode strings should be UCS-2.] Further info:  * [How to convert ArrayBuffer to and from String](http://updates.html5rocks.com/2012/06/How-to-convert-ArrayBuffer-to-and-from-String) * [The encoding spec](http://encoding.spec.whatwg.org/) * [stringencoding shim](https://code.google.com/p/stringencoding/)  About the BOM: The current implementation will check for and remove the leading BOM from the given view to avoid invisible characters that mess up the resulting strings. MDN's documentation for [fromCharCode](https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/String/fromCharCode) suggests that it can correctly convert UCS-2 buffers to strings. And indeed, tests performed with UCS-2 LE encoded frames indicate that it does. However, no tests have been made for UCS-2 BE. (Kid3, the ID3v2 Tag generator used for tests at the time of this writing, goes totally weird when switched to BE)
UCS - 2 ( ISO / IEC 10646 - 1 : 1993 UCS - 2 ) version of readStr . UCS - 2 is the fixed - width two - byte subset of Unicode that can only express values inside the Basic Multilingual Plane ( BMP ) . Note that this method is generally unsuitable for parsing non - trivial UTF - 16 strings which may contain surrogate pairs . [ This is only marginally related though as according to ID3v2 all Unicode strings should be UCS - 2 . ] Further info : * [ How to convert ArrayBuffer to and from String ] ( http : // updates . html5rocks . com / 2012 / 06 / How - to - convert - ArrayBuffer - to - and - from - String ) * [ The encoding spec ] ( http : // encoding . spec . whatwg . org / ) * [ stringencoding shim ] ( https : // code . google . com / p / stringencoding / ) About the BOM : The current implementation will check for and remove the leading BOM from the given view to avoid invisible characters that mess up the resulting strings . MDN s documentation for [ fromCharCode ] ( https : // developer . mozilla . org / en / docs / Web / JavaScript / Reference / Global_Objects / String / fromCharCode ) suggests that it can correctly convert UCS - 2 buffers to strings . And indeed tests performed with UCS - 2 LE encoded frames indicate that it does . However no tests have been made for UCS - 2 BE . ( Kid3 the ID3v2 Tag generator used for tests at the time of this writing goes totally weird when switched to BE )