8

我有 UTF-16 格式的 Base64 编码数据我正在尝试解码数据,但大多数库仅支持 UTF-8。我相信我必须放弃空咬,但我不确定如何。

目前我正在为 Base64 使用David Chambbers Polyfill,但我也尝试过其他库,例如phpjs.org,它们都不支持 UTF-16。

需要指出的一点是,在 Chrome 上 atob 方法没有问题,在 Firefox 中我得到了此处描述的结果,而在 IE 中我只返回了第一个字符。

任何帮助是极大的赞赏

4

1 回答 1

25

您想解码 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);

现在您甚至可以使用智能报价:

var base64 = "HCBoAGUAbABsAG8AHSA="
var binaryStr = base64decode(base64);
var result = decodeUTF16LE(binaryStr);
//"“hello”"
于 2013-01-30T10:31:41.180 回答