2016-07-11 25 views
0

两年后回到这个/另一个话题,我看到人们讨论相同的;我仍然不明白发生了什么事。我不明白字符串到字节方面的计算/ javascript

下面这个SO职位:

String length in bytes in JavaScript

我想了解的JavaScript的这部分!我还有兴趣计算比特币交易的大小,然后将其推送到区块链。但两者中最重要的是我终于明白这些用户在做什么,因为它不止一次出现,我只是不明白!

我已经试过三个概括为答案的功能,但他们似乎都做无非返回string.length减,而我希望他们能够返回不同的值(字符串的以字节为单位的开销/千字节/兆字节)

function byteCount(s) { 
    return encodeURI(s).split(/%..|./).length - 1; 
    } 

console.log(byteCount('hello'),'hello'.length);//5,5 


function getLengthInBytes(str) { 
    var b = str.match(/[^\x00-\xff]/g); 
    return (str.length + (!b ? 0: b.length)); 
    } 

console.log(getLengthInBytes('hello'),'hello'.length);//5,5 


console.log((new TextEncoder('utf-8').encode('hello')).length,'hello'.length);//5,5 

这很烦人,这对我来说毫无意义!显然这些人不会谈论如何获得一些他们可以很容易地用string.length 得到的东西,所以他们试图成功返回什么?

字符串应该是二进制吗? (像这样:How to convert text to binary code in JavaScript?

+1

有一些特殊的字符需要多个字节的空间。试试“Äpfel”。关于UTF的维基百科文章描述了这项工作如何工作 –

+0

Jup我将它写为答案 –

+0

JavaScript使用UCS-2,它是成为Unicode 1.1并且只允许16位(两字节)编码的标准。 Unicode的最新版本实际上可以使用每个字符* 7 *字节。 https://mathiasbynens.be/notes/javascript-unicode –

回答

1

有很多在世界上不同的迹象。 他们不适合一个字节的数据。这就是为什么一些字符使用多个字节的数据。 一些例子:“Äüöôś”

+0

注意:内部JavaScript使用每个字符两个字节,而不是一个。这让它使用UTF-16 ... –

+0

很高兴知道。谢谢 –

1

您与基本ASCII字符测试(当然,他们是UTF8,但你可以把它们像ASCII一点,这些字符在这两个编码工作非常相似)。尝试扩展字符。

console.log((new TextEncoder('utf-8').encode('')).length, ''.length);