我正在尝试计算字符串中的实际字符数,而不考虑它们的含义。
例如,\n
我想计算斜杠( \
和 n
)== 2 个字符而不是 <EOL>
= 1
所以像 a\nb
这样的字符串将等于 4
而不是 3
详情 (一)\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
在一个单元格中)
有什么想法吗?
最佳答案
好吧,我试着在评论中回答,但读起来并不愉快。
这个问题分为两个主要问题:
- 计算原始字符数
- 计算 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
字符应该被认为是一个字符。
在 Python 中,这将是等价的
len("""a
b""")
那是 3。
编辑:JavaScript 中的 Python r
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 编码字符。
关于javascript - 如何计算javascript中字符串中的原始字符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52539453/