假设你有一个字节字符串:"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 图像编码挑战