1

私が欲しいのは、カレットが弦の最初から最後まで移動する時間を計算することです。

説明:このフィドルで
この文字列を見てください:http: //jsfiddle.net/RFuQ3/ 最初の引用符の前にカレットを置いた場合は、右矢印を押してください""
►</kbd> you will push 3 times to arrive after the second quote (instead of 2 times for an empty string).

最初の方法で、文字列の長さを計算するのが最も簡単なのはです<string>.length
しかし、ここでは、2を返します。

2番目の方法はJavaScriptから文字列の実際の長さ(エンティティなし)を取得すると2も得られます。

どうすれば1を取得できますか?


1-文字列をテキスト入力に入れてから、whileループを実行する方法を考えましたtry{setCaret}catch(){}
2-それはただの楽しみです

4

3 に答える 3

2

質問の文字「ꠀ」は Unicode文字「LANGUAGETAG」(U + E0001)です。

次のStackOverflowの質問から、

私たちはそれを学びます

JavaScript文字列はUCS-2でエンコードされますU+0000が、2つの16ビット数(UTF-16サロゲートペア)を使用して、基本多言語ペイン( -U+D7FFおよびU+E000- )の外側のUnicodeコードポイントを表すことができます。最初の数は-U+FFFFの範囲内である必要があります。U+D800U+DFFF

「ꠀ」を表すUTF -16サロゲートペアはとです。10進数では56128、56321です。U+DB40U+DC01U+DB40U+DC01

console.log("".length); // 2
console.log("".charCodeAt(0)); // 56128
console.log("".charCodeAt(1)); // 56321
console.log("\uDB40\uDC01" === ""); // true
console.log(String.fromCharCode(0xDB40, 0xDC01) === ""); // true

https://stackoverflow.com/a/4885062/788324からのコードを適応させると、正しい答えに到達するためにコードポイントの数を数える必要があります。

var getNumCodePoints = function(str) {
    var numCodePoints = 0;
    for (var i = 0; i < str.length; i++) {
        var charCode = str.charCodeAt(i);
        if ((charCode & 0xF800) == 0xD800) {
            i++;
        }
        numCodePoints++;
    }
    return numCodePoints;
};

console.log(getNumCodePoints("")); // 1

jsFiddleデモ

于 2012-06-30T19:11:56.097 に答える
0
function realLength(str) {
    var i = 1;
    while (str.substring(i,i+1) != "") i++;
    return (i-1);
}

コードを試しませんでしたが、うまくいくはずです。

于 2012-06-30T18:26:52.387 に答える
0

Javascriptは実際にはユニコードをサポートしていません。あなたが試すことができます

yourstring.replace(/[\uD800-\uDFFF]{2}/g, "0").length

それが価値があるもののために

于 2012-06-30T18:48:45.483 に答える