javascript - 使用 JavaScript 将文本 chop 到特定大小 (8 KB)

标签 javascript text byte truncate zemanta

我正在使用 Zemanta API,每次调用最多接受 8 KB 的文本。我正在使用 JavaScript 从网页中提取要发送给 Zemanta 的文本,因此我正在寻找一种函数,它可以将我的文本 chop 为恰好 8 KB。

Zemanta 应该自己进行 chop (即,如果您向它发送一个更大的字符串),但我需要在调用 API 之前将这段文本稍微移动一下,所以我希望保持负载尽可能小.

假设 8 KB 的文本是 8,192 个字符并进行相应 chop 是否安全? (每个字符 1 个字节;每 KB 1,024 个字符;8 KB = 8,192 个字节/字符)或者,这是不准确的还是仅在特定情况下才正确?

是否有更优雅的方法根据实际文件大小 chop 字符串?

最佳答案

如果您使用的是单字节编码,是的,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));
}

现在您可以 chop :

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 的原因是,如果您 chop 多字节字符序列中间的字节,您将得到无效的 UTF-8 流,并且 decodeURIComponent 会报错。)

如果它是另一种多字节编码,例如 Shift-JIS 或 Big5,您就得靠自己了。

关于javascript - 使用 JavaScript 将文本 chop 到特定大小 (8 KB),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1515884/

相关文章:

javascript - jquery ajax同步调用beforeSend

c# - 将数据作为字符串从C#发送到Javascript-如何检查字符串?

Javafx Gridpane 单元格背景颜色

python - html转文本使用python语言

python无限循环从其他文本文件获取数据时速度变慢

c# - 位/字节转换

java - Java 字节数组中的无符号字节

javascript - 循环遍历具有特定样式的所有元素

java - 在java中解析http响应字节

javascript - 如何抽象 JQuery 动画方法