24

JavaScript 文字列を「文字」に分割することは簡単にできますが、Unicode を気にする場合 (そして Unicode を気にする必要がある場合) には問題があります。

JavaScript はネイティブに文字を 16 ビット エンティティ ( UCS-2 または UTF-16 ) として扱いますが、これはBMP (Basic Multilingual Plane)以外の Unicode 文字を許可しません。

BMP を超える Unicode 文字を処理するために、JavaScript は「サロゲート ペア」を考慮に入れる必要がありますが、これはネイティブには行われません。

コードポイントが1つまたは2つのJavaScript「文字」(コード単位)を必要とするかどうかにかかわらず、コードポイントでjs文字列を分割する方法を探しています。

必要に応じて、コードポイントによる分割では不十分な場合があり、"書記素クラスター" で分割することをお勧めします。ここで、クラスターはベース コードポイントであり、その後にすべての非間隔修飾子コードポイントが続きます (アクセントと発音記号の組み合わせなど) 。

この質問の目的のために、書記素クラスターによる分割は必要ありません。

4

4 に答える 4

4

ECMAScript 6 では、文字列を反復子として使用してコード ポイントを取得したり、文字列から を検索したり、繰り返し/./ug呼び出したりすることができます。getCodePointAt(i)

残念ながら、構文と正規表現のフラグはforポリフィルofできず、ポリフィルの呼び出しは非常getCodePoint()に遅くなる (O(n²)) ため、しばらくの間、このアプローチを現実的に使用することはできません。

したがって、手動で行う:

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を参照してください。

于 2014-01-28T15:03:31.107 に答える