Bun*_*gle 8 javascript byte text truncate zemanta
我正在使用Zemanta API,每次调用最多可接受8 KB的文本.我正在使用JavaScript从网页中提取要发送给Zemanta的文本,所以我正在寻找一个能够以8 KB的速度截断我的文本的函数.
Zemanta应该自己进行截断(例如,如果你发送一个更大的字符串),但是我需要在进行API调用之前将这个文本稍微移动一下,所以我想保持有效负载尽可能小.
假设8 KB的文本是8,192个字符并且相应地截断是否安全?(每个字符1个字节;每KB 1,024个字符; 8 KB = 8,192个字节/字符)或者,在某些情况下,这是不准确还是仅为真?
是否有更优雅的方法根据实际文件大小截断字符串?
bob*_*nce 11
如果您使用单字节编码,是,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));
}
Run Code Online (Sandbox Code Playgroud)
现在你可以截断:
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);
}
}
Run Code Online (Sandbox Code Playgroud)
(try-catch的原因是,如果你截断多字节字符序列中间的字节,你将得到一个无效的UTF-8流,而decodeURIComponent会抱怨.)
如果它是另一种多字节编码,例如Shift-JIS或Big5,那么你就是自己的.
| 归档时间: |
|
| 查看次数: |
3560 次 |
| 最近记录: |