プログラムの構造を考えるには

[上に] [前に] [次に]
やまさん [E-Mail] 2000/02/04(金) 17:02:13
初心者ですので何卒宜しくお願いいたします。
下記のようなプログラムが本に書いてあったのですが、
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;
}
全体的な意味がよく分かりません。
ここに投稿することはおかしいと思いますが、
何卒、お知恵を頂ければと思います。
宜しくお願いいたします。

Syn [E-Mail] 2000/02/04(金) 17:40:11
JavaScript ですよね。

> function Klength(moji)

Klength とゆー関数の定義を開始する。 引数は moji 。

>     var ki;
>     var len = 0;
>     var c;
>     var cb;

変数の宣言。

>     for (ki = 0; ki < moji.length; ki++) {

for ループ。
ループの初期化処理は ki = 0
ループ継続条件は ki < moji.length
ループ継続時処理は ki++
(ki を 0 から moji の長さまで 1 ずつ加算して繰り返す)

>         c = escape(moji.charAt(ki));

moji の左から ki + 1 番目の一文字 (moji.charAt(ki)) を URL エン
コード (escape()) して c に格納。
(一文字取り出して、文字コードに変換する)

>         cb = eval("0x"+c.charAt(1));

c の左から 2 番目の文字を取り出し (c.charAt(1)) て、 "0x" と結合
し、それを数値として解釈 (eval()) させる。
(文字コードの上位バイトを取り出す)

>         if ((cb == 8) || (cb == 9) || (cb == 14) || (cb == 15)) len++;

もし cb が 8 か 9 か 14 か 15 なら、 len に 1 を加算。
(文字コードが Shift_JIS の 2 バイトコードの範囲内だったら、 下の
len++ と合わせて 2 を加算)

>         len++;

len に 1 を加える。
(1 バイト文字であれば 1 を加算)

>     }

ループの終端。

>     return len;

len の長さを関数の戻り値として返す。

とゆーわけで、この処理を総合すると、
「(Shift_JIS の) 文字列のバイト数を返す」
関数となります。
moji.length だと、 2 バイトコードも一文字として数えてしまう
ので、
バイト数を知りたい場合はこのような関数が必要になります。

ミソは、
>         c = escape(moji.charAt(ki));
>         cb = eval("0x"+c.charAt(1));
>         // 2バイトコードの場合は長さを1バイト加える
>         if ((cb == 8) || (cb == 9) || (cb == 14) || (cb == 15)) len++;

の部分ですね。
取り出した一文字を escape して、上位 4 ビット部分を読み取って
8 ・ 9 ・ E ・ F なら 2 バイトコードだと判定しています。
Shift_JIS でしか通用しないし、 UNICODE で escape してしまう
IE もダメなような気がしますが…。

# まちがってたら指摘してくださいね〜 >識者のかたがた

やまさん [E-Mail] 2000/02/07(月) 14:46:45
Synさん
御指導ありがとうございます。
再度、ご質問ですが8・9・E・Fなら2 バイトコードだと判定しています。
のところが分からないです。
申し訳ありませんが再度御指導お願いいたします。

Syn [E-Mail] 2000/02/07(月) 16:16:00
ええと、文章でうまく説明できないので、
http://kanzaki.com/docs/jcode.html#sjis
を見ていただきたいです。
Shift_JIS の文字の 1 バイト目はかならず 0x80 - 0x9F か
0xE0 - 0xEF (あれ、Fは含まれないのか…) になるので、
それを判定すれば2バイト文字かどうかがわかるということ
です。

もうひとつのCheckKatakana()の件も、このあたりを見ると
なにかわかるのではないかと思います。

やまさん [E-Mail] 2000/02/07(月) 16:29:37
[[解決]]
Synさん
ご丁寧な御指導ありがとうございます。
やっと、意味が解りました。
長々と初心者にお付き合い頂きありがとうございました。。

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