【问题标题】:JavaScript truncate text by bytes lengthJavaScript 按字节长度截断文本
【发布时间】:2019-09-03 10:07:06
【问题描述】:

我想将一段 utf8 编码的文本截断为给定的字节长度。例如,如果文本是

Hello ????, I like rice cakes ¯\_(ツ)_/¯

我想将该文本截断为最多 10 个字节。

我发现 truncate-utf8-bytes NPM 模块完全符合我的需要,不幸的是,我正在处理的项目不使用 webpack 或 browerify,所以据我所知,我无法使用这些 NPM 模块

所以我想知道是否有一种可靠的方法来截断文本,或者是否有一种方法可以让我在浏览器中使用 truncate-utf8-bytes 模块。

谢谢

【问题讨论】:

  • @Shinjo 是的,我有,但我阅读了已弃用的解决方案。我还需要考虑多字节字符和代理对的解决方案。
  • 真的吗?它运行良好 FWIW:jsfiddle.net/0xmcauqw 也许您可以添加所需的输出和“我还需要考虑多字节字符和代理对的解决方案。”你的输入和预期输出是什么?还有你目前的进展是什么,minimal reproducible example
  • 您没有阅读软件包的文档吗? “提供了不使用 Buffer.byteLength 的A browser implementation”(使用thisthat)。如果您的项目不使用捆绑器,则意味着您必须手动捆绑,但代码仍然存在。
  • this这样的东西怎么样

标签: javascript


【解决方案1】:

假设你知道文本的编码,这样的事情应该可以工作:

let str = 'Hello ?, I like rice cakes ¯\_(ツ)_/¯';
let enc = new TextEncoder();
let dec = new TextDecoder('utf-8');
let uint8 = enc.encode(str)
let section = uint8.slice(0,11)
let result = dec.decode(section);
console.log('result', result);

【讨论】:

  • 我认为这正是我想要的。我已经在使用 TextDecoder 来检查字节长度,我只是不知道有一个 TextEncoder。太感谢了。快速的问题,uint8.slice(0, 11),每个数组项是否代表一个字节?
  • 是的,在那个例子中 uint8 是一个 8 位字节的数组(这是你想要的 utf8)。请注意,切片将拆分使用多个字节的任何字符。据我了解,TextDecoder 可以确保渲染安全,但您可能需要检查一下以达到您的目的。
  • 另请注意:TextEncoder 现在仅支持 utf8 (developer.mozilla.org/en-US/docs/Web/API/TextEncoder),但有一个用于其他编码的 polyfill。
【解决方案2】:

答案 1 效果很好,但您可以考虑将其添加到末尾以避免出现被截断中间字符的无效字符:

result.replace(/\uFFFD/g, '')

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-05
    • 1970-01-01
    相关资源
    最近更新 更多