WEB相談室

Webページ作成に関しての何でも掲示板です。

タイトル:JavaScriptについて

0:[投稿] みゆき [2002/02/15 12:54 ][環境:WIN+IE わからない]

はじめまして、みゆきと申します。
最近、JavaScriptをはじめたばかりの初心者です。
ですが、何点か分からない事がありまして、どなたか
知っている方々いらっしゃいましたら、お教え頂ける
と助かります。お願いします。

<質問>
inputタグで作成したテキストボックスに入力されている英数字が
全角の時、すべて半角に切り替えて処理するという仕様変更に今、
対応しているところなのですが、この方法がわかりません。
全角を半角に切り替えるというようなコマンドがありましたら、教
えて下さい。
また、入力されている文字列が全角か半角かを判定する時はどうし
たらよいのかも教えて頂けると助かります。
(if文で切り分けるのだと思うのですが、
  if 文字列 = ??? then 〜
 この???の部分(全角なり半角を表すもの)がわかりません)


1:[回答] ヨシミ [2002/02/15 13:25 ]

参考。
http://tohoho.wakusei.ne.jp/lng/199910/99100217.htm


2:[回答] hama [2002/02/15 13:33 ]

こんにちは。

全角を半角に一発で変換してくれるような都合の良い物は
残念ながらありませんので、

もし、文字列に
1234567890ABC...abc...(全角)
が含まれていたら、それを
1234567890ABC...abc...(半角)
に置換する
という処理を行う必要があります。

以下が参考になると思います。
http://www.openspc2.org/reibun/javascript/business/005/index.html


3:[回答] hama [2002/02/15 13:34 ]

かぶっちゃった。


4:[完了] みゆき [2002/02/15 17:57 ]

ヨシミさん、hamaさん、お忙しい中、回答ありがとうございました。リンク先の参考資料で、無事に解決致しました。
ありがとうございました。


5:[質問] みゆき [2002/02/18 11:49 ]

みゆきです。再び再質問と言いますか、少し混乱して
しまいまして、良かったら誰かお教え頂けますと助かり
ます。

http://www.openspc2.org/reibun/javascript/business/005/index.html

上記リンク先での、ちょっと気になった点がございまして
>han = "0123456789.,-+";
>zen = "0123456789.,−+";
>str = "";
>for (i=0; i<motoText.length; i++)
>{
>  c = motoText.charAt(i);
>  n = zen.indexOf(c,0);
>  if (n >= 0) c = han.charAt(n);
>  str += c;
>}
>return str;

上記のこちらは、元になる文字列(motoText)から0番目の
文字の抜き出し、全角文字(zen)の中に同じものがあるか
ないかを確認し、あれば半角に変えて「str」という変数に
結合し、次に元になる文字列から1番目を抜き出し・・・と
元になる文字列の文字数回、繰り返すということなのだと
思います。
でももし、全角文字列(zen)の中に同じものがなかった時
(つまり半角だった時)はif文を抜けて、そのまま
return strに入ると思いますが、ここのreturn strとは
何を表すのでしょうか?
全角でなかったとしても、文字列は結合しなくてはいけ
ないのかな、などと思ったので質問してみました。

なんか分かりづらい文章でごめんなさい。
よろしくお願い致します。


6:[回答] ばあど [MAIL] [URL] [2002/02/18 12:36 ]

>  str += c;
この行できちんと結合されますので、問題ありません。
で、
>return str;
この行でその文字列を返すわけです。
>  if (n >= 0) c = han.charAt(n);
全角半角変換を行っている核の部分はここだけです。

#やはりと言うかなんと言うか、NN3では上手く動作しません。
#全角文字を2つの文字として扱うブラウザでは機能しないですね。


7:[回答] ma-to [2002/02/19 00:45 ]


> #やはりと言うかなんと言うか、NN3では上手く動作しません。
> #全角文字を2つの文字として扱うブラウザでは機能しないですね。


大雑把にするのであれば簡単、以下のようにすればよい。
もとの質問の目的はpostする前にブラウザで出来ることがあればやっておこうということなんだろう。。。という想像通りなら、別に骨董品ブラウザに対応させなくてもいい。N3以上想定。
まず文字列処理。
色んな場合での検証はしていない。


if(
    window.String&&
    typeof(String.prototype)=='object'
){

    String.han=
        "!\"#$%&'()*+,-./"+
        "0123456789"+
        ":;<=>?@"+
        "ABCDEFGHIJKLMNOPQRSTUVWXYZ"+
        "[\\]^_`"+
        "abcdefghijklmnopqrstuvwxyz"+
        "{|}~";

    String.zen=
        "!”#$%&’()*+,−./"+
        "0123456789"+
        ":;<=>?@"+
        "ABCDEFGHIJKLMNOPQRSTUVWXYZ"+
        "[¥]^_‘"+
        "abcdefghijklmnopqrstuvwxyz"+
        "{|} ̄";

    String.select_case=String.zen.length/String.han.length;

    if(2==String.select_case){
        var
            _tmp_=new Array(),
            Count=String.zen.length/2;
        for(var i=0;i<Count;i++)
            _tmp_[i]=String.zen.charAt(2*i)+String.zen.charAt(2*i+1);
        String.zen=_tmp_;
    }

    String.prototype.zen2han=new Function(
        "var "+
            "$string='',"+
            "count=this.length;"+
        "if(1==String.select_case){"+
            "for(var i=0;i<count;i++){"+
                "var $char=this.charAt(i);"+
                "$string+="+
                    "String.han.charAt(String.zen.indexOf($char))"+
                    "||"+
                    "$char;"+
            "};"+
            "return $string;"+
        "}"+
        "else if(2==String.select_case){"+
            "var _tmp_=new Array();"+
            "count--;"+
            "for(var i=0;i<count;i++){"+
                "_tmp_.flag=false;"+
                "_tmp_[i]=this.charAt(i)+this.charAt(i+1);"+
                "for(var j=0;j<Count;j++)"+
                    "if(String.zen[j]==_tmp_[i]){"+
                        "_tmp_.flag=true;"+
                        "i++;"+
                        "$string+=String.han.charAt(j);"+
                        "break;"+
                    "};"+
                "if(_tmp_.flag)"+
                    "continue;"+
                "$string+=this.charAt(i);"+
            "};"+
            "if(i==count)"+
                "$string+=this.charAt(i);"+
            "return $string;"+
        "}"
    );
}


具体的にこれをどう使うのかは、以下の通り。
同じ条件を問うているのは、形式上。1つのファイルに書くのなら、上記の{ }に含めればいい。

if(
    window.String&&
    typeof(String.prototype)=='object'&&
    String.prototype.zen2han
){

    if(!window.addEventListener)
        var addEventListener=new Function("type","listener",
            "this['on'+type]=listener;"
        );

    var
        input_change=new Function(
            "this.value=(new String(this.value)).zen2han();"
        );

        window_onload=new Function(
            "var input=document.forms['myForm'].elements['myText'];"+
            "if(!input.addEventListener)"+
                "input.addEventListener=addEventListener;"+
            "input.addEventListener('change',input_change,false);"
        );

    addEventListener('load',window_onload,false);
}


8:[質問] みゆき [2002/02/20 12:25 ]

みゆきです。再び質問です。

いろいろと混乱していまして…
テキストに入力された文字列がShift_JISかそうじゃないか
を判定する方法がわかりません。
チェックのタイミングは、文字列がテキストに入力されて、
Submitボタンが押された時です。
処理の流れは下記の通りです。

1.テキストに文字列を入力し、Submitボタン押下
 ↓
2.その文字列がShift_JISかどうかを判定
 ↓
3.Shift_JISだった時、全角を半角に変換する処理。
  Shift_JISでない時、アラートでメッセージを出力。
 ↓
4.終了

以上です。
文字列がShift_JISか、そうでないかを判定するための材料が
わかりません。
(If 文字列 = ??? then ・・・この???の部分です)

度々、申し訳ございませんがどなたかお教え頂けますと
助かります。


9:[回答] ウイン [2002/02/20 13:26 ]

>>8
あの、Shift_JISって理解していますか?

そして、ブラウザに表示された時点で、文字コードは決まっています。
つまり、このようなチェックは、無意味かと。

>>7
で決まりのような気がします。


10:[回答] ween [2002/02/20 13:37 ]

最近の JavaScript 実装では文字列は内部的に Unicode に変換されます。
そういう判定は不可能かつ不要だと思います。

回答(必須): 状態:

お名前(必須):

e-mail:

URL:




[戻る]

ChaichanPAPA's World