首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >是否将JavaScript字符串拆分为码点数组?(考虑“代理对”,但不考虑“字素簇”)

是否将JavaScript字符串拆分为码点数组?(考虑“代理对”,但不考虑“字素簇”)
EN

Stack Overflow用户
提问于 2014-01-28 13:09:52
回答 4查看 5.3K关注 0票数 19

将JavaScript字符串拆分成“字符”很简单,但是如果你关心Unicode (而且你应该关心Unicode),就会有问题。

JavaScript本机将字符视为16位实体(UCS-2 or UTF-16),但这不允许BMP (Basic Multilingual Plane)之外的Unicode字符。

要处理BMP之外的Unicode字符,JavaScript必须考虑"surrogate pairs",而它本身并不这样做。

我正在寻找如何按代码点拆分js字符串,代码点是否需要一个或两个JavaScript“字符”(代码单元)。

根据您的需要,按codepoint拆分可能还不够,您可能想要按"grapheme cluster“拆分,其中集群是一个基础代码点,后面跟着它的所有非间距修饰符代码点,如combining accents and diacritics

出于此问题的目的,我不需要按字素簇进行拆分。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2017-03-04 22:03:02

@bobince的答案(幸运的是)有点过时了;你现在可以简单地使用

代码语言:javascript
复制
var chars = Array.from( text )

以获取单代码点字符串的列表,该字符串符合astral /32位/代理Unicode字符。

票数 27
EN

Stack Overflow用户

发布于 2018-09-27 06:51:59

按照@John Frazer的回答,可以使用这种更简洁的字符串迭代形式:

代码语言:javascript
复制
const chars = [...text]

例如,使用:

代码语言:javascript
复制
const text = 'A\uD835\uDC68B\uD835\uDC69C\uD835\uDC6A'
const chars = [...text] // ["A", "", "B", "", "C", ""]
票数 7
EN

Stack Overflow用户

发布于 2014-01-28 23:03:31

在ECMAScript 6中,您可以使用字符串作为迭代器来获取代码点,也可以在字符串中搜索/./ug,也可以重复调用getCodePointAt(i)

不幸的是,for..of语法和正则表达式标志不能是多填充的,而且调用多填充的getCodePoint()会非常慢(O(n²)),所以我们暂时还不能实际地使用这种方法。

因此,请手动执行以下操作:

代码语言:javascript
复制
String.prototype.toCodePoints= function() {
    chars = [];
    for (var i= 0; i<this.length; i++) {
        var c1= this.charCodeAt(i);
        if (c1>=0xD800 && c1<0xDC00 && i+1<this.length) {
            var c2= this.charCodeAt(i+1);
            if (c2>=0xDC00 && c2<0xE000) {
                chars.push(0x10000 + ((c1-0xD800)<<10) + (c2-0xDC00));
                i++;
                continue;
            }
        }
        chars.push(c1);
    }
    return chars;
}

有关这方面的相反情况,请参阅https://stackoverflow.com/a/3759300/18936

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21397316

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档