JavaScript中的UTF-16到UTF-8转换

Don*_*n P 6 javascript base64 utf-8 utf-16

我有UTF-16的Base64编码数据我试图解码数据,但大多数库只支持UTF-8.我相信我必须放弃零咬,但我不确定如何.

目前我正在使用David Chambbers Polyfill for Base64,但我也尝试过其他库,例如phpjs.org,其中没有一个支持UTF-16.

有一点需要指出的是,在Chrome上,atob方法可以解决问题,Firefox我得到了这里描述的结果,而在IE中我只返回了第一个字符.

任何帮助是极大的赞赏

Esa*_*ija 18

您想要解码UTF-16,而不是转换为UTF-8.解码意味着结果是一串抽象字符.当然,在javascript中也有字符串的内部编码,UTF-16或UCS-2,但这是一个实现细节.

对于字符串,目标是您不必担心编码,而只是"按原样"操纵字符.因此,您可以编写根本不需要解码输入的字符串方法.当然,有许多边缘情况会崩溃.

你只能通过删除空值来解码utf-16.我的意思是这对于unicode的前256个代码点工作正常,但是当使用unicode中的任何其他~110000个字符时,你会得到垃圾.你甚至无法获得最流行的非ASCII字符,如em dash或任何智能引号.

另外,看看你的例子,它看起来像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);
Run Code Online (Sandbox Code Playgroud)

现在你甚至可以获得智能报价:

var base64 = "HCBoAGUAbABsAG8AHSA="
var binaryStr = base64decode(base64);
var result = decodeUTF16LE(binaryStr);
//"“hello”"
Run Code Online (Sandbox Code Playgroud)