我使用的是Zemanta应用程序接口,它每次调用最多接受8KB的文本。我正在使用JavaScript从网页中提取要发送到Zemanta的文本,因此我正在寻找一个函数,该函数将截断我的文本,大小正好为8KB。
Zemanta应该自己完成这个截断(即,如果您向它发送一个更大的字符串),但在进行API调用之前,我需要在这个文本之间穿梭一点,所以我希望使有效负载尽可能小。
假设8 KB的文本是8,192个字符,并相应地截断是否安全?(每个字符1个字节;每KB 1,024个字符;8 KB= 8,192字节/字符)或者,这是不准确的,还是只有在某些情况下才是正确的?
有没有更好的方法来根据字符串的实际文件大小截断它?
发布于 2009-10-04 13:36:30
如果您使用单字节编码,则为8192 characters=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,那就只能靠自己了。
发布于 2009-10-04 08:11:01
不,假设8KB的文本是8192个字符是不安全的,因为在某些字符编码中,每个字符都占用multiple bytes。
如果要从文件中读取数据,就不能直接获取文件大小吗?还是以8KB的大小读入?
发布于 2018-08-24 09:11:42
您可以这样做,因为取消转义已部分弃用
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;
}https://stackoverflow.com/questions/1515884
复制相似问题