Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 转换UTF-8字符串,每个字符仅8位_Javascript_String_Utf 8 - Fatal编程技术网

Javascript 转换UTF-8字符串,每个字符仅8位

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更好的吗?您可以使

我有一个JavaScript字符串,其中包含
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;ichars[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 ) );
}