首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用JavaScript将文本截断到特定大小(8 KB)

使用JavaScript将文本截断到特定大小(8 KB)
EN

Stack Overflow用户
提问于 2009-10-04 08:06:55
回答 4查看 5.2K关注 0票数 8

我使用的是Zemanta应用程序接口,它每次调用最多接受8KB的文本。我正在使用JavaScript从网页中提取要发送到Zemanta的文本,因此我正在寻找一个函数,该函数将截断我的文本,大小正好为8KB。

Zemanta应该自己完成这个截断(即,如果您向它发送一个更大的字符串),但在进行API调用之前,我需要在这个文本之间穿梭一点,所以我希望使有效负载尽可能小。

假设8 KB的文本是8,192个字符,并相应地截断是否安全?(每个字符1个字节;每KB 1,024个字符;8 KB= 8,192字节/字符)或者,这是不准确的,还是只有在某些情况下才是正确的?

有没有更好的方法来根据字符串的实际文件大小截断它?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2009-10-04 13:36:30

如果您使用单字节编码,则为8192 characters=8192字节。如果您使用的是UTF-16,8192个字符(*)=4096个字节。

(实际上是8192个代码点,这在面对代理时是一件稍微不同的事情,但我们不必担心这一点,因为JavaScript不会。)

如果您正在使用UTF-8,有一个快速技巧可以用最少的代码在JS中实现UTF-8编码器/解码器:

代码语言:javascript
复制
function toBytesUTF8(chars) {
    return unescape(encodeURIComponent(chars));
}
function fromBytesUTF8(bytes) {
    return decodeURIComponent(escape(bytes));
}

现在,您可以使用以下命令截断:

代码语言:javascript
复制
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,那就只能靠自己了。

票数 13
EN

Stack Overflow用户

发布于 2009-10-04 08:11:01

不,假设8KB的文本是8192个字符是不安全的,因为在某些字符编码中,每个字符都占用multiple bytes

如果要从文件中读取数据,就不能直接获取文件大小吗?还是以8KB的大小读入?

票数 2
EN

Stack Overflow用户

发布于 2018-08-24 09:11:42

您可以这样做,因为取消转义已部分弃用

代码语言:javascript
复制
function byteCount( string ) {
    // UTF8
    return encodeURI(string).split(/%..|./).length - 1;
}

function truncateByBytes(string, byteSize) {
    // UTF8
    if (byteCount(string) > byteSize) {
        const charsArray = string.split('');
        let truncatedStringArray = [];
        let bytesCounter = 0;
        for (let i = 0; i < charsArray.length; i++) {
            bytesCounter += byteCount(charsArray[i]);
            if (bytesCounter <= byteSize) {
                truncatedStringArray.push(charsArray[i]);
            } else {
                break;
            }
        }
        return truncatedStringArray.join('');
    }
    return string;
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1515884

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档