33

より正確に言うと、特定の文字列に 2 バイト文字が含まれているかどうかを確認できるかどうか (可能であれば、その方法も) を知る必要があります。基本的に、ポップアップを開いて、中国語や日本語などの 2 バイト文字を含むテキストを表示する必要があります。この場合、ウィンドウ サイズを英語または ASCII の場合よりも調整する必要があります。誰にも手がかりがありますか?

4

6 に答える 6

43

これには mikesamuel の回答を使用しました。ただし、おそらくこの形式のせいでu、たとえば、の前にエスケープスラッシュが1つだけある必要があり、これを正しく機能さ\uせないことに気付きました。\\u

function containsNonLatinCodepoints(s) {
    return /[^\u0000-\u00ff]/.test(s);
}

私のために働きます:)

于 2009-11-08T20:06:34.373 に答える
32

JavaScript は、Unicode のかなり広範なサブセットをエンコードできる UCS-2 として内部的にテキストを保持します。

しかし、それはあなたの質問とはあまり関係ありません。解決策の 1 つは、文字列をループして各位置の文字コードを調べることです。

function isDoubleByte(str) {
    for (var i = 0, n = str.length; i < n; i++) {
        if (str.charCodeAt( i ) > 255) { return true; }
    }
    return false;
}

これは、あなたが望むほど速くないかもしれません。

于 2008-09-29T13:18:00.100 に答える
6

実際、少なくとも Javascript エンジンの観点からは、すべての文字が Unicode です。

残念ながら、特定の Unicode 範囲内に文字が存在するだけでは、より多くのスペースが必要であると判断するには不十分です。ASCII 範囲をはるかに超える Unicode コードポイントを持つ他の文字とほぼ同じ量のスペースを占める文字がいくつかあります。活版印刷の引用符、分音記号付きの文字、特定の句読点記号、およびさまざまな通貨記号は、ASCII の下位範囲外にあり、Unicode 基本多言語面のまったく異なる場所に割り当てられます。

一般的に、私が取り組んできたプロジェクトでは、すべての言語に余分なスペースを提供するか、javascript を使用して、自動スクロールバー css 属性を持つウィンドウに実際にスクロールバーをトリガーする高さのコンテンツがあるかどうかを判断します。

CJK 文字の存在または数を検出するだけで、少し余分なスペースが必要であると判断できる場合は、[\u3300-\u9fff\uf900-\ufaff] の範囲を使用して正規表現を作成し、一致する文字数のカウントを抽出します。(これは少し粗すぎて、BMP 以外のすべてのケースを見逃しており、おそらく他の関連する範囲を除外しており、関連性のない文字をいくつか含んでいる可能性が高いですが、これは出発点です)。

繰り返しになりますが、フル テキスト レンダリング エンジンのラインに沿ったものを使用せずに大まかなヒューリスティックを管理することしかできません。実際に必要なのは、GDI の MeasureString (または他のテキスト レンダリング エンジンの同等物) のようなものだからです。私がそうしてからしばらく経ちましたが、最も近い HTML/DOM の同等物は div に幅を設定し、高さを要求することだと思います (切り取りと貼り付けの再利用なので、これにエラーが含まれている場合はお詫びします):

o = document.getElementById("test");

document.defaultView.getComputedStyle(o,"").getPropertyValue("height"))
于 2008-09-29T08:10:28.887 に答える
0

ランタイムの高さ/幅に基づいてウィンドウのサイズを変更しないのはなぜですか?

ポップアップで次のように実行します。

window.resizeTo(document.body.clientWidth, document.body.clientHeight);
于 2008-09-29T07:53:59.770 に答える