代码之家  ›  专栏  ›  技术社区  ›  Ricky Levi

如何在javascript中计算字符串中的原始字符?

  •  3
  • Ricky Levi  · 技术社区  · 6 年前

    我试图计算字符串中的实际字符,而不管它们的含义。 例如, \n \ n <EOL> = 1

    a\nb 将等于 4 而不是 3

    细节 (1) \n个

    var a = `a
    b`;
    
    console.log(a.length)
    >>> 3
    

    >>> a = r'a\nb'
    >>> len(a)
    4
    

    (2) 聪明的报价

    var a = 'a“b';
    console.log(a.length);
    >>> 3
    

    >>> b = 'a“b'
    >>> len(b)
    5
    

    我尝试了很多函数(比如将字符串制动到数组,但是 在单个单元格中)

    2 回复  |  直到 6 年前
        1
  •  2
  •   Andrea Giammarchi    6 年前

    这个问题分为两个主要问题:

    • 计数ASCII长度而不是UTF-16长度

    计算生煤焦

    将'\n'字符串视为带有一个反斜杠和一个 n 字母,是使用一个函数标记和一个 template literal .

    const rawlength = tpl => tpl.raw.join('').length;
    
    `a\nb`.length;   // 3
    rawlength`a\nb`; // 4
    

    rawlength

    还要记住,如果您使用如下所示的模板文本

    `a
    b`
    

    它的长度仍然是3,因为里面确实没有反斜杠,所以 \n char被认为是一个char。

    在Python中,这是等效的

    len("""a
    b""")
    

    那是3。

    r

    相当于 r

    const r = (t, ...v) => {
      const result = [t.raw[0]];
      const length = t.length;
      for (let i = 1; i < length; i++)
        result.push(v[i - 1], t.raw[i]);
      return result.join('');
    };
    

    r`a\nb`
    

    会产生你所期望的结果。

    您可以添加以下技巧 result.join('')

    计数ASCII长度而不是UTF-16长度

    这是一个老把戏总是计数字节:

    unescape(encodeURIComponent('a“b')).length;
    

    5 ,因为 encodeURIComponent unescape %XX

    'a“b' 变成 a%E2%80%9Cb 哪个是 ab 加上3个url编码字符。

        2
  •  0
  •   tunnes    6 年前

    你试过换新的吗 \n 一个双重可数的角色?比如:

    'a\nb'.replace('\n', '--').length # return 4