我正在使用
Zemanta API,每次调用最多可接受8 KB的文本.我正在使用JavaScript从网页中提取要发送给Zemanta的文本,所以我正在寻找一个能够以8 KB的速度截断我的文本的函数.
Zemanta应该自己进行这种截断(即,如果你发送一个更大的字符串),但是我需要在进行API调用之前将这个文本稍微移动一下,所以我想保持有效负载尽可能小.
假设8 KB的文本是8,192个字符,并相应截断是否安全? (每个字符1个字节;每KB 1,024个字符; 8 KB = 8,192个字节/字符)或者,在某些情况下,这是不准确还是仅为真?
解决方法
如果您使用单字节编码,是,8192个字符= 8192个字节.如果您使用的是UTF-16,8192个字符(*)= 4096个字节.
(实际上是8192个代码点,这在代理人面前略有不同,但是我们不要担心,因为JavaScript没有.)
如果您使用的是UTF-8,那么您可以使用快速技巧在JS中使用最少的代码实现UTF-8编码器/解码器:
function toBytesUTF8(chars) { return unescape(encodeURIComponent(chars)); } function fromBytesUTF8(bytes) { return decodeURIComponent(escape(bytes)); }
现在你可以截断:
function truncateByBytesUTF8(chars,n) { var bytes= toBytesUTF8(chars).substring(0,n); while (true) { try { return fromBytesUTF8(bytes); } catch(e) {}; bytes= bytes.substring(0,bytes.length-1); } }
(try-catch的原因是,如果你截断多字节字符序列中间的字节,你将得到一个无效的UTF-8流,而decodeURIComponent会抱怨.)
如果它是另一种多字节编码,例如Shift-JIS或Big5,那么你就是自己的.