4

フォーム内の文字を除外する必要があります。したがって、非常にうまく機能し、さまざまなコンテキストに応じてさまざまなフィルター (変数) を使用するフィルタリング アウト アルゴリズムを実装しました。アクセント付きの文字も多用しなければなりません。

例:

gFilterALPHA1="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'-–àâäéèêëîïôöùüûÀÂÄÉÈÊËÎIÔÖÙÛÜæÆœŒçÇ ";

不思議なことに、文字é(e 急性) またはè(e 墓) は考慮されます (そのように見なされます) が、à(a 墓) などの他の文字は考慮されません。解決策は8進リテラルを使用することであることがわかりました-たとえば、それぞれ墓またはu墓の場合\340\371

Q1. é(e acute) が正常に解析され、他のアクセント付きの文字が正しく解析されない理由についての手がかりはありますか?

Q2. 8 進リテラルの長い文字列を書くのは面倒で、値をチェックしたり追加したりするときにエラーが発生しやすいので、誰かがより良いアイデアを持っているか、回避策を知っていますか?

ありがとう。

OK、これが thg435 が一見すると便利だと考えるコードです。

function jFiltre_Champ(event, NomDuFiltre)
{
    var LeChamp=event.target.value; // value est de type ARRAY
    switch (NomDuFiltre)
    {
        case "NUM1":
        LeFiltre=gFiltreNUM1;
        Msg=gMessageNUM1;
        break;
    case "ALPHA1":
        LeFiltre=gFiltreALPHA1;
        Msg=gMessageALPHA1;
        break;
    case "DATE1":
        LeFiltre=gFiltreDATE1;
        Msg=gMessageDATE1;
    break;
    case "ALPHANUM1":
        LeFiltre=gFiltreALPHANUM1;
        Msg=gMessageALPHANUM1;
        break;
    case "ALPHANUM2":
        LeFiltre=gFiltreALPHANUM2;
        Msg=gMessageALPHANUM2;
        break;
}
Longueur=LeFiltre.length;
for (i=0;  i<LeChamp.length; i++)
{
    leCar = LeChamp.charAt(i);
    for (j = 0;  j < Longueur;  j++)
    {
        if (leCar==LeFiltre.charAt(j)) break;
    }
    if (j==Longueur)
    {
        alert(Msg);
    /*Cf doc. pour l'algorithme de la méthode slice*/
        document.getElementById(event.target.id).value=event.target.value.slice("0", i);
        break;
    }
}

}

これは英語版です:((2)に関して)

function jform_input_filter(event, filterName)
{
    var current_input = event.target.value; // the value is an array
    switch (filterName)
    {
        case "NUM1":
        current_filter = gFilterNUM1;
        Msg = gMessageNUM1;
        break;
    case "ALPHA1":
        current_filter = gFilterALPHA1;
        Msg = gMessageALPHA1;
        break;
    case "DATE1":
        current_filter = gFilterDATE1;
        Msg = gMessageDATE1;
    break;
    case "ALPHANUM1":
        current_filter = gFilterALPHANUM1;
        Msg = gMessageALPHANUM1;
        break;
    case "ALPHANUM2":
        current_filter = gFilterALPHANUM2;
        Msg = gMessageALPHANUM2;
        break;
}
length = current_filter.length;
for (i = 0;  i < current_input.length; i++)
{
    leCar = current_input.charAt(i);
    for (j = 0;  j < length;  j++)
    {
        if (leCar==current_filter.charAt(j)) break;
    }
    if (j == length)
    {
        alert(Msg);
    /*Cf doc. pour l'algorithme de la méthode slice*/
        document.getElementById(event.target.id).value=event.target.value.slice("0", i);
        break;
    }
}

コメント:

  1. 個人的には、このコードが元の質問に答えるのに役立つとは思いません。
  2. 変数とコメントはフランス語であるため、読みにくい場合があります。
  3. この関数は、HTML フォーム内の「onchange」イベントに関連付けられています。
  4. 「g」変数 (gFiltreALPHANUM2 など) は、関数からアクセスできるように、同じ .js ファイル内の別の場所で定義された広範囲のベクトルです。
4

1 に答える 1

2

Bergi はおそらく正しいでしょう。あなたのファイルはおそらく間違ったエンコーディングで保存または配信されています。UTF-8 は、Unicode 文字セットで十分にサポートされているエンコーディングと考えてください。このアイデアをテストするには、スクリプトを一時的に調整して、a-with-acute-accent をフィールドまたはテキスト ノードとしてページに出力します。8 進数のエスケープ コードではなく、文字列リテラルでそのままの文字を使用します。文字化けしている場合は、文字がそのままの形でブラウザに表示されず、エンコーディングに問題があります。

エンコードの問題が確認された場合は、ファイルを正しく保存するか、応答の文字エンコードを調整する必要があります。これは、特定の Web サーバーによって異なります。Fiddlerを使用して Content-Type 応答ヘッダーを検査することにより、Web サーバーによって配信される現在のエンコーディングを見つけることができます。ファイルが正しいエンコーディング (できれば、示されているように UTF-8) であると Web サーバーが既に認識している場合は、テキスト エディタをチェックして、JavaScript ファイルがまったく同じエンコーディングで保存されていることを確認してください。

質問に直接コメントできないと思うので、これを回答として書いています。

于 2013-01-02T04:59:41.973 に答える