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

4
我想要统计字符串中实际字符的数量,而不考虑它们的含义。 例如,\n ,我想把反斜杠(\)和字母 n(n)一起算作 2 个字符,而不是作为一个行尾符(<EOL>)仅算作一个字符。
因此,像 a\nb 这样的字符串将等于 4 而不是 3
详情 (1) \n
var a = `a
b`;

console.log(a.length)
>>> 3

但是在Python中

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

(2) 智能引号 Javascript

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

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

我尝试了许多函数(例如将字符串分割成数组,但是\n在单个单元格中)。
有什么想法?

2
在字符串中,你不能计算转义字符。例如,如果你有一个带有\t的字符串字面量,它会被编译成与带有字面制表符的字符串相同。 - Dai
2
字符串 中没有斜杠字符。它只出现在 JavaScript 源代码中。 - Quentin
考虑两个字符串,"\u00e6" 和 "æ"。这些是相同的字符串。一旦定义,就没有逆转过程的方法。请参见:http://jsbin.com/mubajuf/edit?html,output - HoldOffHunger
普通的Python字符串不是Unicode,它们只是普通的字节。因此,“”长3个字节但只有1个字符长。 - Salman A
@SalmanA 我明白以上所有人的意思,但是我的后端和前端字数统计不匹配...我就是不相信没有解决方案,这就是为什么我创建了这个帖子.. - Ricky Levi
2
你可以使用 String.raw\a\nb`.length`(类似于 Python 的 r)来实现。 - bigless
2个回答

2

好的,我尝试在评论中回答,但阅读起来不太愉快。

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

  • 计算原始字符数
  • 计算 ASCII 长度而不是 UTF-16 长度

我将用示例回答这两个问题。

计算原始字符数

将 '\n' 字符串视为一个反斜杠和一个 n 字母组成的两个字符的唯一方法是使用函数标签和模板字面量

const rawlength = tpl => tpl.raw.join('').length;

`a\nb`.length;   // 3
rawlength`a\nb`; // 4

您可以复制以上代码并读取两个不同的结果。请注意,使用rawlength时不使用括号不是笔误,这是模板文字的工作方式。

还要注意,如果您使用以下模板文字:

`a
b`

由于其中没有反斜杠,因此其长度仍为3,因此 \n 字符将被视为一个字符,正如它应该显示的那样。

在Python中,这将是等效的。

len("""a
b""")

那是一个3。

编辑:Python中的r在JavaScript中的等价物

在JavaScript中,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 /字节呈现。

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

这是一个旧技巧,始终计算字节数:

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

这是一个 5,因为 encodeURIComponent 会返回文本的UTF-8友好版本的url,而 unescape 会对每个遇到的 %XX 创建一个字符。

在这种情况下,'a“b' 变成了 a%E2%80%9Cb,这是 ab 加上3个url编码字符。


所以 rawlength\a\nb`; // 4正是我需要的,问题是它在一个变量里面 :/ 那么我该如何使用变量a` 运行它呢? - Ricky Levi
1
就像在Python中一样,您需要在前面使用r(我已在我的答案中进行了编辑,以便清楚地说明如何在JS中执行此操作),如果您分配s ='a \ nb',那么它已经被转换为3个字符的字符串,因此您可以在定义时使用模板文字标记,否则您将没有运气,因为转义字符与\ x27相同,在JS中是引号而不是4个长度的字符串,\ n和其他字符也不例外。但是,如果您在输入字段中直接编写a \ nb,则该字符串已经作为4个长度的字符串到达,因此我不确定您的问题是什么。 - Andrea Giammarchi
我会标记这个答案,因为 r 就像在 Python 编码中一样有帮助的匹配...现在我明白你想说什么了!非常感谢! - Ricky Levi

0
你尝试替换`\n`为一个双可计数字符吗?类似这样的操作:
```'a\nb'.replace('\n', '--').length # 返回 4```

1
不完全准确,因为\n只是一个例子,它可以是任何隐藏字符...而且我不想在代码中手动映射它们。 - Ricky Levi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接