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

时间:2013-01-29 21:11:29

标签: javascript utf-8 base64 utf-16

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

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

有一点需要注意的是,在Chrome上,atob方法可以解决问题,Firefox我得到的结果是here,而在IE中我只返回了第一个字符。

非常感谢任何帮助

1 个答案:

答案 0 :(得分: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);

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

var base64 = "HCBoAGUAbABsAG8AHSA="
var binaryStr = base64decode(base64);
var result = decodeUTF16LE(binaryStr);
//"“hello”"