【问题标题】:How to get the length of the outputted string containing zero or negative width characters like \u0007 or \b如何获取包含零或负宽度字符(如 \u0007 或 \b)的输出字符串的长度
【发布时间】:2015-05-07 07:21:34
【问题描述】:

我有一个字符串'aa\b\u0007\u0007'

var a = 'aa\b\u0007\u0007';
console.log(a); 
//=> a //+ 2 beeps
console.log(a.length); 
//=> 5

这里a.length 只给了我5,但输出的字符串只是a,它的长度只有1。

如何获得?

【问题讨论】:

  • 什么是“真实”长度?
  • 长度是什么字体?
  • 不,没有办法计算 glyphs(至少使用内置 JS 工具)
  • @YOU 它依赖字体吗?你不认为重要的是 Unicode(及其在特定渲染引擎中的实现)吗?
  • "这里a.length 只是给了我5,但输出的字符串只是a" 输出where?不同的环境呈现不同的事物。有些会将铃铛字符渲染为某种符号。

标签: javascript node.js


【解决方案1】:

这里有几个不同的问题。

首先,不同的环境会以不同的方式呈现该字符串。有些会将铃铛字符渲染为实际的字形;其他的,比如传统的控制台,会发出声音。有些也会将(一些)零宽度字符呈现为各种字形。没有人解释“这就是这个字符串在考虑退格和零宽度字符后有多长”。

您需要确定要在您的情况下应用的规则。 The Unicode site 可能有助于一些传统的解释。或者,如果您只是对解释老式 ASCII 感兴趣,那会容易得多,但我们当然不再生活在 ASCII 世界中(这是一件好事(tm) )。

一旦您有了规则,根据它们的复杂程度,您或许可以使用一个或多个正则表达式来应用它们。例如,这个 simplistic 正则表达式将退格视为它应该删除前一个字符,并删除字符代码小于 32 的所有其他字符(传统上,“控制字符”)。同样,这不完整,在该领域之外有大量 Unicode 零宽度字符(开头有各种零宽度空格)。并且在 Unicode 范围内进行彻底的工作将是一个项目,而不是一个微不足道的功能。

但只是举例:

function getInterpretedLength(s) {
  return s.replace(/(?:.[\b])|[\u0000-\u001f]/g, "").length;
}

第二 问题是对于某些 Unicode 代码点(大致称为“字符”),JavaScript 计算 两个 JavaScript 字符,而不是一个。那是因为JavaScript strings are a 16-bit encoding like UTF-16,除了它们容忍无效的代理对,而且有些字符用两个 16 位值编码,而不仅仅是一个。

因此,这将是一个大型项目,或者如果您可以根据您实际尝试解决的问题对其进行充分限制,它可能会更小一些。

【讨论】:

    【解决方案2】:

    查看this answer,您可以尝试在获取长度之前使用replace 去除不可打印的字符,如下所示:

    console.log(a.replace(/[^\x20-\x7E]+/g, '').length);
    

    【讨论】:

      【解决方案3】:

      实际上,您可以使用画布计算字符数,但 Web 中没有真正的退格字符,其行为类似于终端。因此,您必须手动计算将其减去退格键。

      var text = 'aa\b\u0007\u0007';
      var context = document.createElement('canvas').getContext("2d");
      context.font="30px Courier New";
      var length = context.measureText(text).width / context.measureText('x').width - text.match(/\x08/g).length;
      
      alert(length);
      //1

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-05-13
        • 1970-01-01
        相关资源
        最近更新 更多