0

テーブルに のタイプのフィールドがありTINYTEXTます。フィールドのエンコーディングは ですUTF8-UNICODE-ci。中国語がフィールドに何かを入力すると制限は 88 文字になりますが、イラン人がペルシア語で何かを入力すると、約 135 文字になります。そのため、最大テキスト長は Unicode に基づいて異なります。この状況を克服し、特定の言語に基づいて単語カウンターを作成するにはどうすればよいですか?
方法はありますか?私はそれに対するアプローチを見つけることができませんでした;(

PS: jQuery API全体を読みましたが、PHP で mb_strlen() のようなものを見つけることができませんでした。

4

3 に答える 3

1

あなたの質問は文字について話しているので、「単語カウンター」とは「文字カウンター」を意味すると思います。

このカウンターの作成には、次の 2 つの部分があります。

  1. UTF-8 文字列のバイト数をカウントする方法が必要です。ありがたいことに、他の誰かがすでにこの質問に答えています:

    encodeURIComponent(text).replace(/%[A-F\d]{2}/g, 'U').length
    
  2. ユーザーが何かを入力するたびに count 関数をトリガーする方法が必要です。keyupイベントを使用できます。

    $('textarea').keyup(function () { ... });
    

完成した例を次に示します: http://jsfiddle.net/jefferyto/DWwQr/


更新:あなたが探しているのは、ユーザーが入力できる残りの文字数を示すカウントダウンカウンターだと思います。

技術的には、1 文字に入るバイト数を仮定すると、これを計算するのは難しくありません。

(characters left) = Math.floor((255 - (num bytes in string)) / (num bytes in character))

しかし、これはユーザーの観点からは良い考えではありません:

  1. として何を使用しnum bytes in characterますか?

    1 を使用すると、最初はカウンターが 255 になりますが、これは ASCII 文字の場合にのみ当てはまります。ユーザーは 255 文字の漢字を入力できません。

    選択した数値は、一部のユーザーにとっては正しくありません。

  2. ユーザーがテキストの入力を開始すると、カウンターはユーザーが期待するように 1 つずつカウントダウンしませんが、理解できないステップで (ユーザーには理解できません) カウントダウンします。

    計算に 1 文字あたり 1 バイトを想定すると、ユーザーがテキストを入力する前に、カウンターは 255 を示します。ユーザーが 4 バイト文字を入力すると、カウンターは 251 に変わります。

    ユーザーが 1 文字を入力したにもかかわらず、カウンターが別の数だけ減少したことは、ユーザーにとって意味がありません。

TINYTEXT の代わりに VARCHAR を使用することをお勧めします。VARCHAR フィールドの長さは、バイト数ではなく文字数で定義されます。そうすることで、文字数が安定して正確になります。

于 2012-07-04T12:42:45.487 に答える
0

これが役立つかもしれませんhttp://tympanus.net/codrops/2009/11/08/jmaxinput-twitter-like-textarea/ 私はこれでそれをチェックしました。これを1文字としてカウントします。

于 2012-11-15T19:18:17.757 に答える
0

mysql から UTF-8 を取得し、カウントする前に JavaScript で UTF-16 に変換できます。このような変換を実行するために取り組んだ古いプロジェクトを覚えているようです。

編集: 私たちが使用したコードは、ここで発生したようです。

于 2012-07-02T21:24:34.937 に答える