UTF-8 に変換するのではなく、UTF-16 をデコードしたい。デコードとは、結果が抽象的な文字列であることを意味します。もちろん、文字列の内部エンコーディング、JavaScript の UTF-16 または UCS-2 もありますが、それは実装の詳細です。
文字列の目標は、エンコーディングについて心配する必要はなく、文字を「そのまま」操作することだけです。したがって、入力をまったくデコードする必要のない文字列メソッドを作成できます。もちろん、これが崩壊する多くのエッジケースがあります。
null を削除するだけでは utf-16 をデコードできません。つまり、これは Unicode の最初の 256 コード ポイントでは問題なく機能しますが、Unicode の他の ~110000 文字のいずれかが使用されると、ゴミが発生します。em ダッシュやスマート クォートなどの最も一般的な非 ASCII 文字を使用することさえできません。
また、あなたの例を見ると、UTF-16LEのように見えます。
//Braindead decoder that assumes fully valid input
function decodeUTF16LE( binaryStr ) {
var cp = [];
for( var i = 0; i < binaryStr.length; i+=2) {
cp.push(
binaryStr.charCodeAt(i) |
( binaryStr.charCodeAt(i+1) << 8 )
);
}
return String.fromCharCode.apply( String, cp );
}
var base64decode = atob; //In chrome and firefox, atob is a native method available for base64 decoding
var base64 = "VABlAHMAdABpAG4AZwA";
var binaryStr = base64decode(base64);
var result = decodeUTF16LE(binaryStr);
これで、スマート クォートを機能させることもできます。
var base64 = "HCBoAGUAbABsAG8AHSA="
var binaryStr = base64decode(base64);
var result = decodeUTF16LE(binaryStr);
//"“hello”"