如何在 JavaScript 中将位字符串编码为 UTF16 字符串,以免浪费任何空间



假设你有一个字节字符串:"0100010101110001010..." .如何将其转换为UTF16字符串(例如:"A|b☮"),以及如何将其转换回原始字节字符串?

我已经尝试了下面的实现,但似乎我对 UTF16 的理解不够好,并且在某些(我不知道是哪种)情况下代码中断。

var pad = function(x){
    while(x.length%16!==0)
        x="0"+x;
    return x;
}
var unpack_bin = function(a){
    for(var r="",i=0,l=a.length;i<l;++i)
        r+=pad((a[i].charCodeAt(0)-36).toString(2));
    return r.slice(r.indexOf("1")+1);
}
var pack_bin = function(a) {
    for (var s="",i=0,l=a.length,a=pad("1"+a);i<l;i+=16) 
        s+=String.fromCharCode(parseInt(a.slice(i,i+16),2)+36);
    return s;
}

您不能将 16 位放入一个 UTF-16 单元中,但可以容纳 14 位。

CJK 统一表意文字是一个由 20941 个有效 unicode 字符组成的连续块,每个字符由单个 UTF-16 单元编码。

function pad(x, div){
    while(x.length%div!==0)
        x="0"+x;
    return x;
}
function unpack_bin(packedString){
    var binString = "";
    for(var i=0; i<packedString.length; ++i) {
        var binValue = packedString[i].charCodeAt(0)-0x4E00;
        binString += pad(binValue.toString(2), 14);
    }
    return binString.slice(binString.indexOf("1")+1);
}
function pack_bin(binString) {
    binString = pad("1"+binString, 14);
    var packedString = "";
    for(var i=0; i<binString.length; i+=14) {
        var charCode = parseInt(binString.slice(i, i+14), 2)+0x4E00;
        packedString += String.fromCharCode(charCode);
    }
    return packedString;
}

另请参阅:Twitter 图像编码挑战

最新更新