【问题标题】:How to get the nth (Unicode) character from a string in JavaScript如何从 JavaScript 中的字符串中获取第 n 个(Unicode)字符
【发布时间】:2018-02-19 19:45:30
【问题描述】:

假设我们有一个包含一些(星形)Unicode 字符的字符串:

const s = 'Hi ???? Unicode!'

[] 运算符和.charAt() 方法不适用于获取第 4 个字符,应该是“????”:

> s[3]
'�'
> s.charAt(3)
'�'

.codePointAt() 确实获得了第 4 个字符的正确值,但不幸的是它是一个数字,必须使用 String.fromCodePoint() 转换回字符串:

> String.fromCodePoint(s.codePointAt(3))
'????'

同样,使用 splats 将字符串转换为数组会产生有效的 Unicode 字符,因此这是获取第 4 个字符的另一种方法:

> [...s][3]
'????'

但我无法相信从字符串到数字再到字符串,或者必须将字符串拆分为数组是做这件看似微不足道的事情的唯一方法。没有简单的方法吗?

> s.simpleMethod(3)
'????'

注意:我知道“字符”的定义有些模糊,但就本问题而言,字符只是对应于 Unicode 代码点的符号(无组合字符、无字形簇等)。

更新:String.fromCodePoint(str.codePointAt(n)) 方法实际上并不可行,因为那里的 nth 位置没有考虑以前的星体符号:String.fromCodePoint('????????'.codePointAt(1)) // => '�'


(我觉得这个问题有点愚蠢;好像我可能遗漏了一些明显的东西。但是previous answers 这个问题不适用于星体平面上带有 Unicode 符号的字符串。)

【问题讨论】:

  • 你看过这个页面developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… 有一些代码示例吗?
  • @ivo 不,我没见过,有趣!代码示例有一个“固定”版本的 charAt,这很有用,但我想知道是否有一个好的方法已经支持该语言????
  • 这是 Javascript。简单的事情不可能那么简单:)
  • 如果 jQ 是您的选择,它内置在 there jsfiddle.net/bq2w3fub ????
  • @rndus2r 嗯,我看不出 jQ 在这里有什么帮助,jQ 的 text() 按原样返回字符串,并且不以 ant 特殊方式处理星体字符,看起来:jsfiddle.net/epidemian/ha8ydznk

标签: javascript unicode


【解决方案1】:

字符串迭代器是唯一遍历代码点而不是 UCS-2/UTF-16 代码单元的东西。所以:

const string = 'Hi ? Unicode!';
for (const symbol of string) {
  console.log(symbol);
}

所以要根据它的索引从字符串中获取特定的代码点:

const string = 'Hi ? Unicode!';
// Note: The spread operator uses the string iterator under the hood.
const symbols = [...string]; 
symbols[3]; // '?'

不过,这会与字素簇或表情符号序列(例如?‍?‍?‍?? + U+200D ZERO WIDTH JOINER + ? + U+200D ZERO WIDTH JOINER + ? + U+200D ZERO WIDTH JOINER + ?)中断。 Text segmentation 对此有所帮助。

但是,您真的需要获取字符串中的第 4 个代码点吗?你的用例是什么?

【讨论】:

  • 好吧,要处理您所说的“破坏性”,而 OP 特别提到他并不关心的问题,需要针对个别语言的专门逻辑,例如也有复杂集群的卡纳达语它只能由相当复杂的算法组成。
  • 感谢马蒂亚斯!您关于 Unicode 的文章非常详尽!好的,所以数组 spt 方法可能是当时最简单的方法。那……我猜不太好?。回答您实际需要获得第 4 个代码点的问题:不,我最初的用例只涉及获得第一个代码点。我注意到str[0] 不适用于某些字符,所以我最终问自己“等等,你到底是如何从 JS 中的字符串中获取特定字符的?”,我们在这里......
  • 为什么“表情符号序列”既不考虑其自身的字符,也不考虑字素簇?
  • @Melab:就text segmentation 而言是这样。问题是字符串迭代,codePointAt等不处理字形。
  • 明智的用例,我正在标记代码,并且需要为非法字符创建异常。异常消息包括非法字符的 Unicode 代码点。
【解决方案2】:

如果您可以使用新的u 标志来进行正则表达式,您可以使用它。

const chars = 'Hi ? Unicode!'.match(/./ug);
console.log(chars);

【讨论】:

    猜你喜欢
    • 2022-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-24
    • 2014-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多