我有UTF-16的Base64编码数据我正在尝试解码数据,但大多数库只支持UTF-8。我相信我必须放弃零咬,但我不确定如何。
目前我正在使用David Chambbers Polyfill用于Base64,但我也尝试了其他库,例如phpjs.org,其中没有一个支持UTF-16。
有一点需要注意的是,在Chrome上,atob方法可以解决问题,Firefox我得到的结果是here,而在IE中我只返回了第一个字符。
非常感谢任何帮助
答案 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”"