带字符串的Unicode字符串由字符分隔

Gap*_*pro 10 javascript string unicode split char

我有这个Unicode字符串: ??????????????????

而且我想通过字符分开.现在,如果我尝试循环所有字符的真相,我得到这样的东西:
A a a ' ? ...

有没有办法将此字符串正确分割为字符: ? ? ??

bob*_*nce 10

要正确执行此操作,您需要的是用于计算字形集群边界的算法,如UAX 29中所定义.不幸的是,这需要知道哪些字符是哪些类的成员,从Unicode字符数据库和JavaScript不能提供该信息(*).因此,您必须在脚本中包含UCD的副本,这会使其非常笨重.

如果您只需要担心拉丁语或西里尔语使用的基本音调,则可以选择仅使用组合变音标记块(U + 0300-U + 036F).对于其他语言和符号,这将失败,但可能足以满足您的要求.

function findGraphemesNotVeryWell(s) {
    var re= /.[\u0300-\u036F]*/g;
    var match, matches= [];
    while (match= re.exec(s))
        matches.push(match[0]);
    return matches;
}

findGraphemesNotVeryWell('??????????????????');
["?", "?", "??", "?", "?", "??", "?", "?", "??", "?", "?", "?", "?", "?", "?"]
Run Code Online (Sandbox Code Playgroud)

(*:可能有一种方法可以通过让浏览器呈现字符串来提取信息,并测量其中的选择位置......但是它肯定会非常混乱并且很难在跨浏览器中工作.)


Vit*_*kov 7

这个软件包可以帮助您:https: //www.npmjs.com/package/runes

const runes = require('runes')

const example = 'Emoji '
example.split('') // ["E", "m", "o", "j", "i", " ", "?", "?"] 
runes(example)    // ["E", "m", "o", "j", "i", " ", ""] 
Run Code Online (Sandbox Code Playgroud)


小智 6

对此进行一些更新。

随着ES6的出现,出现了新的字符串方法和处理字符串的方法。在此存在两个问题的解决方案。

1)表情符号和代理对

0x0000 - 0xFFFF可以算出超出基本多语言平面(BMP)(范围中的Unicode“代码点”)的Emoji表情符号和其他Unicode字符,因为ES6中的字符串遵循迭代器协议,因此您可以这样操作:

let textWithEmoji = '\ud83d\udc0e\ud83d\udc71\u2764'; //horse, happy face and heart
[...textWithEmoji].length //3
for (char of textWithEmoji) { console.log(char) } //will log 3 chars
Run Code Online (Sandbox Code Playgroud)

2)变音符号

当您开始使用“字素簇”(一个字符及其变音符号)时,一个更难解决的问题。在ES6中,有一种方法可以简化此工作,但是仍然很难工作。该String.prototype.normalize方法简化了工作,但正如Mathias Bynens所述

(A)带有多个组合标记的代码点始终会产生单个视觉字形,但可能没有规范化的形式,在这种情况下规范化无济于事。

在这里可以找到更多的见解:

https://ponyfoo.com/articles/es6-strings-and-unicode-in-depth https://mathiasbynens.be/notes/javascript-unicode

  • 这是自ES6发布以来最好的答案。可以提到`Array.from`,出于完整性考虑,它也使用String迭代器。 (2认同)