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

utf 8 - UTF-16 to UTF-8 conversion in JavaScript

本文关键字:UTF-8 转换 UTF-16 中的 JavaScript utf      更新时间:2023-09-26

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

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

需要指出的一件事是在Chrome上,atob方法在没有问题的情况下工作,Firefox我得到了这里描述的结果,而在IE中,我只返回第一个字符。

任何帮助都非常感谢

您要解码 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”"