JavaScriptの構造について

[上に] [前に] [次に]
やまさん 2000/02/23(水) 20:55:22
初心者ですので宜しくお願い致します。
function Klength(moji)
{
    var ki;
    var len = 0;
    var c;
    var cb;

    for (ki = 0; ki < moji.length; ki++) {
        c = escape(moji.charAt(ki));
        cb = eval("0x"+c.charAt(1));
        // 2バイトコードの場合は長さを1バイト加える
        if ((cb == 8) || (cb == 9) || (cb == 14) || (cb == 15)) len++;
        len++;
    }
    return len;
}
プログラムがありますが、バイトチェックを行いたいのです。
(1バイトは、エラーで2バイトはOKにしたい)
len++;の部分を
else
errMsg = "半角があります";を追加すれば良いのでしょうか?
何卒、お願い致します。

チャペル 2000/02/23(水) 21:35:20
こんにちわです。(こんばんわかなぁ)

エラー後の処理は置いておくとして、
処理を書く場所はそこでいいかな。
ただelseで書くよりも、else if(条件文) で書いた方が安全です。
何かの間違いでとんでもない値が入ってくる可能性も無きにしもあらずなので・・・。

やまさん 2000/02/23(水) 21:54:46
チャペル様御指導ありがとうございます。
再度、お聞きしたいのですが、
if ((cb == 8) || (cb == 9) || (cb == 14) || (cb == 15)) len++;
        len++;
    }

if ((cb == 8) || (cb == 9) || (cb == 14) || (cb == 15)) len++;
   else
if ?????
    }
申し訳ありません。どのように記載すれば良いのでしょうか?
再度、御指導お願いできればと思います。
宜しくお願い致します。

チャペル 2000/02/23(水) 23:36:34
if ((cb == 8) || (cb == 9) || (cb == 14) || (cb == 15)){
    len++;
}
else if(一バイトの時の条件式(でいいのかな?)){
    エラーメッセージ
}

ではないでしょうか?

三原克大 [E-Mail] 2000/02/24(木) 00:38:05
> ただelseで書くよりも、else if(条件文) で書いた方が安全です。
> 何かの間違いでとんでもない値が入ってくる可能性も無きにしもあらずなので・・・。

はい。もしも IE 4.0 以降で走らせると必然的にとんでもない値が入ってくるはずです。
具体的には、
>         c = escape(moji.charAt(ki));
>         cb = eval("0x"+c.charAt(1));
escape() の動作が Unicode 上での 0xFF を区切りに変わっていて、
FF 以下(ISO-8859-1 と同じ)なら %xx ですが
FF を越えると Unicode での値 %uxxxx を返します。
         C == '0xu'
         cb = eval('0xu'); ..... いきなりエラーです。
大変だあ。
やっぱり、今の JavaScript で JIS X208 と ASCII の切替えを
前提としたバイト長を計算するのは徒労が多いです。
制御構造を追加すれば何とかなりますが、そのときは
逆に Netscape との併存を考える必要もでますし。

やまさん 2000/02/24(木) 14:59:43
チャペル様、三原克大様
御指導ありがとうございます。
上記の分で”一バイトの時の条件式(でいいのかな?)”の
設定は難しいのでしょうか?
どのように設定すれば宜しいのでしょうか?
宜しくお願い致します。

チャペル 2000/02/24(木) 15:11:50
私もあまり深い知識はないのでこれ以上は・・・・。

私もバイトチェックはやってますけど、こんな感じではやはり問題があるのかなぁ?

// バイト数チェック関数
// 引数: value → チェックデータ
// 戻り値:バイト数
//////////////////////////////////////////////////////////////////////
function GetLength(value){
var i,nCnt=0;

for(i=0; i<value.length; i++){
if(escape(value.charAt(i)).length >= 4 ) nCnt+=2;
else nCnt++;
}
return nCnt;
}

チャペル 2000/02/24(木) 15:27:02
上記に追加。

// データタイプ全角の入力チェック関数
// 引数: value → チェックデータ
// 戻り値:半角だったらfalse,全角だったらtrue
//////////////////////////////////////////////////////////////////////
function StrCheck_zen(value){
if(value != "" && GetLength(value) != value.length * 2) return false;
return true;
}

// データタイプ半角の入力チェック関数
// 引数: value → チェックデータ
// 戻り値:全角だったらfalse,半角だったらtrue
//////////////////////////////////////////////////////////////////////
function StrCheck_han(value){
if(value != "" && GetLength(value) != value.length) return false;
return true;
}

三原克大 [E-Mail] 2000/02/24(木) 17:48:44
> 私もバイトチェックはやってますけど、こんな感じではやはり問題があるのかなぁ?

私の方こそ「徒労が多い」なんて書いて経験の浅さをさらしちゃいました。

もしも JIS X208 の文字を escape() した場合
Netscape Communicator/Navigator %xx%xx
Internet Explorer, ECMA-262     %uxxxx
となり偶然にも length == 6 が成り立つ
# Netscape Communicator 4.7 [Laser5 Linux] で実験。
# IE と ECMA-262 はドキュメントから
ので、チャペルさんの関数で実用できます。

三原克大 [E-Mail] 2000/02/24(木) 18:07:33
まて、Netscape Navigator 3 や IE 3 だとどうなるんだろうか ?
やまさんの示した関数では
charAt() で JIS X208 の文字が一文字として
操作されることを前提にしているけれども、
オクテット単位でしか操作しない環境もあるのかなあ。
(個人的にはその環境は切り捨てたいけれど)
保証は出来ない...

やまさん 2000/02/25(金) 00:00:16
[[解決]]
チャペル様、三原克大様
何度も御指導頂き有り難う御座いました。うまく作業が出来ました。
今後共、宜しくお願い致します。

[上に] [前に] [次に]