我使用Zemanta的 API,它接受多达8 KB的每个呼叫的文本。 我提取文本,从使用JavaScript的网页发送到Zemanta的,所以我在寻找,这将正好8 KB截断我的文字的功能。
Zemanta的应该这样做截断自身(例如,如果你发送一个较大的字符串),但我需要接送逛了一下这个文本进行API调用之前,所以我想保持载荷尽可能小。
它是安全的假设,8 KB的文本是8,192个字符,并相应地截断? (每个字符1个字节;每KB 1024个字符; 8 KB = 8,192字节/符号)或者,是不准确的或唯一的真正给出某些情况?
有没有截断根据它的实际文件大小的字符串更优雅的方式?
如果您使用的是单字节编码,是的,8192个字符= 8192个字节。 如果使用的是UTF-16,8192个字符(*)= 4096个字节。
(实际上8192码点,这是在代理人面对一个稍微不同的东西,但我们不要担心,因为JavaScript没有。)
如果您使用的是UTF-8,有一个快速的技巧可以用来实现一个UTF-8编码器/ JS中最小码解码器:
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,你对你自己的。
不,这不是安全的假设文本是8KB为8192个字符,因为在某些字符编码,每个字符占用多个字节 。
如果你正在阅读从文件中的数据,你就不能抢文件大小? 或在8KB的数据块在读它?
正如多米尼克说,字符编码的问题-但是如果你可以真正确保你只用8位字符处理(不可能的,但可能),或者假设16位字符,并限制自己一半的可用空间,即4096字符,那么你可以尝试这个。
这是一个坏主意,依靠JS这个,但因为它可以平凡修改或忽略你必须逃逸字符和编码的并发症处理为例。 最好使用JS作为第一机会滤波器和使用任何服务器端语言您有可用(这也将打开压缩)。
你可以做这样的事情,因为UNESCAPE部分弃用
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;
}