プログラムの構造を考えるには
[上に]
[前に]
[次に]
やまさん
[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さん
ご丁寧な御指導ありがとうございます。
やっと、意味が解りました。
長々と初心者にお付き合い頂きありがとうございました。。
[上に]
[前に]
[次に]