Javascript 转换UTF-8字符串,每个字符仅8位
我有一个JavaScript字符串,其中包含Javascript 转换UTF-8字符串,每个字符仅8位,javascript,string,utf-8,Javascript,String,Utf 8,我有一个JavaScript字符串,其中包含charCode大于255的字符 我希望能够将该字符串编码/解码为另一个字符串,该字符串的所有charCode小于或等于255 字符没有限制(例如:可以是不可打印的) 我想要一个尽可能快并且产生尽可能小的字符串的解决方案 它还必须适用于任何UTF-8字符 我发现,encodeURI确实做到了这一点,但它似乎占用了很多空间 encodeURI('ĉ') === "%C4%89" // 6 bytes... 还有什么比encodeURI更好的吗?您可以使
charCode
大于255的字符
我希望能够将该字符串编码/解码为另一个字符串,该字符串的所有charCode
小于或等于255
字符没有限制(例如:可以是不可打印的)
我想要一个尽可能快并且产生尽可能小的字符串的解决方案
它还必须适用于任何UTF-8字符
我发现,encodeURI
确实做到了这一点,但它似乎占用了很多空间
encodeURI('ĉ') === "%C4%89" // 6 bytes...
还有什么比
encodeURI
更好的吗?您可以使用.charCodeAt(position)
获取字符的ASCII值。您可以使用此命令将一个字符拆分为多个字符
首先,通过循环字符串获取每个字符的字符代码。创建一个临时空字符串,当字符代码高于当前字符的255时,将其除以255,并放入一个ÿ
(扩展ASCII表的第256个字符),然后在其低于255时使用字符串。fromCharCode(charCode)
,将其转换为字符,并将其置于临时字符串的末尾,最后,用这个字符串替换这个字符
function encode(string) {
var result = [];
for (var i = 0; i < string.length; i++) {
var charCode = string.charCodeAt(i);
var temp = "";
while (charCode > 255) {
temp += "ÿ";
charCode -= 255;
}
result.push(temp + String.fromCharCode(charCode));
}
return result.join(",");
}
您要做的是将字符串编码为UTF8。我发现,在谷歌上搜索如何在Javascript中实现这一点,它提供了:
function encode_utf8( s ) {
return unescape( encodeURIComponent( s ) );
}
function decode_utf8( s ) {
return decodeURIComponent( escape( s ) );
}
或者简言之,几乎完全是您已经找到的内容,再加上将“%xx”代码转换为一个字节。UTF-8已经是一种unicode文本编码,每个字符使用8位。您只需通过导线发送UTF-8字符串即可 通常,JavaScript字符串由UTF-16字符组成 对于此类字符串,可以将每个UTF-16字符编码为两个8位字符,也可以使用动态长度编码,如UTF-8 如果有许多非ASCII字符,第一个字符可能会产生较小的结果
//请参见http://monsur.hossa.in/2012/07/20/utf-8-in-javascript.html
函数编码(utf8){
返回unescape(一个或多个组件);
}
函数解码\u utf8(s){
返回组件(转义);
}
函数编码固定长度{
设长度=s.长度>1);
字节[i]=代码>>8;
字节[++i]=代码&0xFF;
}
返回字符串.fromCharCode.apply(未定义,字节);
}
函数解码固定长度{
设长度=s.length,
chars=新数组(长度>>1);
for(设i=0;i chars[i>>1]=(s.charCodeAt(i)除了没有大于255的字符码外,您对编码还有其他要求吗?是否允许有引号、空格、不可打印字符、NUL字符?没有其他要求。数据以二进制形式发送。快速和尽可能小有些互斥。您可以尝试str的LZW压缩ing。您要压缩的字符串有多大,为什么要压缩它?例如,如果是GET请求,也许您可以使用POST请求,这样可以非常有效地传输字节。您可以将每个字符的字符字符编码转换为基数255,然后用一个未使用的字符对其进行分隔。@AndrewMorton我正在使用一个压缩库,它将一个对象编码到一个二进制缓冲区中。该库假设对象中字符串的每个字符都适合1字节。这看起来不错,但这只是答案的一半。我还需要解码功能。我相信尝试编码“ÿ”
可能会导致问题。当前代码不起作用。请尝试解码(encode('265'))=='265'
。我将使用RemcoGerlich答案,因为它也快得多。无论如何,谢谢。@RainingChain-Huh,我知道问题所在,让我来解决it@RainingChain现在它起作用了,我不知道你从哪里得到的“另一个更快”encodeURIComponent
和unescape
中的一部分是本机代码,速度很快。您的解决方案使用字符串连接和。split
速度很慢。嗯,我尝试了一个长字符串,它输出了一个字符,它不在扩展ASCII表上什么是“扩展ASCII表”?扩展ASCII表是包含0-255字符代码的ASCII表,而不是包含0-127字符代码的ASCII表(这是普通的ASCII表)。没有包含0-255字符代码的ASCII表。对于不同的语言等,有许多不同的此类表(不称为ASCII)。ISO 8859表(如拉丁语-1),Windows代码页等。只有一个ASCII表,即从0到127的表。@Bálint:该表是错误的。您也可以链接到,或,或其他任何内容。我不知道您链接到的页面的编码是什么,但它不是“扩展ASCII”。
function encode_utf8( s ) {
return unescape( encodeURIComponent( s ) );
}
function decode_utf8( s ) {
return decodeURIComponent( escape( s ) );
}