<textarea>で文字数を制限するには?

[上に] [前に] [次に]
TOMOTAMO 1998/01/28(水) 11:41:56
<textarea>タグで、col・row の属性を指定しても、その枠以上の大きさの文字列を書き込んで form できてしまいますよね。
この時に、決まった文字数以上のものは切り捨てるなり、
エラーをだすなりして form させないようにするにはどうしたら良いでしょうか?

TH 1998/01/28(水) 19:01:34
こんにちは
文字を切り捨てるだけでいいなら、CGI で切り捨てればいんでは
ないでしょうか?
もしくは、CGI さえ起動かけたくないのであれば、Java Script を
使用すれば、警告(alert)くらいは出せますよね。
それでは駄目なんでしょうか?

miyasiro [E-Mail] 1998/01/29(木) 01:35:05
Java Script は、本来 form からの送信をサーバに負担をかけずに
クライアント側でチェックできるようにするために開発されたと
何かで読んだ記憶があります。
まさに、こういう場合のためにあるのでは?

B-Cus 1998/01/29(木) 07:50:33
> 文字を切り捨てるだけでいいなら、CGI で切り捨てればいんでは
> ないでしょうか?

ところで、CGI側で日本語を適切に切れますでしょうか。
最後の部分が変に切れてしまって、その後が化ける…と
いったことは確実に回避できますか?

とわ [HomePage] 1998/01/29(木) 12:36:25
通りすがりのものですが・・・

> ところで、CGI側で日本語を適切に切れますでしょうか。
> 最後の部分が変に切れてしまって、その後が化ける…と
> いったことは確実に回避できますか?

 「切る」というより、「エラー処理に飛ばして登録しない」様にすれば、
文字化けは起こりませんが・・・
 エラー処理に修正用の欄をもうけるか、バックボタンで戻って修正する
ように指示すればCGIに2バイト文字の判定をさせる必要はないですよ。

TH 1998/01/29(木) 17:48:55
文字化けに関してですが、エンコードされた文字は(エンコードされてるのが普通ですが)
7bit アスキー文字以外は %(16進数2文字)(16進数2文字) という構成になってるのは
ご存知ですよね。それを文字化けしないように切るのは、そんなに難しいことでしょうか?

hiro-kim 1998/01/29(木) 18:51:29
JavaScript初心者です。とりあえずlengthプロパティが使えるかどうか試してみました。

日本語1文字を,Navigator3では2文字分としてカウントしますが,Explorer4では1文字としてカウントしますね。Byte数を知るビルトイン関数が見あたらないので,lengthはあまり役立たないみたいです。両ブラウザとも,改行はCR+LFで2文字とカウントしました(Win95)。

ということは,Explorerにも対応させるためには,escape関数(http://www.tohoho-web.com/wwwjsref.htm#Builtin)を使ってMIMEエンコードして,1Byteずつループで見ていかなければならないのでしょうか。めんどくさーい。

<html>
<head>
<script language="JavaScript">
<!--
function CheckLen(obj) {
    alert("文字数は" + obj.value.length);
}
//-->
</script>
</head>
<body>
<form name="Form1">
    <textarea name="Area1" cols=40 rows=4></textarea>
    <input type="button" value="文字数は?" onClick="CheckLen(Form1.Area1)">
    <input type="reset"  value="クリア">
</form>
</body>
</html>

B-Cus 1998/01/29(木) 23:47:55

:とわさん

> 「切る」というより、「エラー処理に飛ばして登録しない」様にすれば、
> 文字化けは起こりませんが・・・

まあそれはそうなんですが、選択肢の一つとして知っておいて損は
ないかなと思いまして。

:THさん
> 文字化けに関してですが、エンコードされた文字は(エンコードされて
> るのが普通ですが) 7bitアスキー文字以外は %(16進数2文字)
> (16進数2文字) という構成になってる

んーと、%[0-9A-Z][0-9A-Z]でないですかね?
つまり1バイトですよね。1バイトじゃ日本語1文字は
表せないから、当然それらを組み合わせてマルチバイト
コードを使いますよね。

で、変なところできるとゴミが出てしまうのではないか、
と思ったわけです。

ここらへんの知識はまったくないので変なことを言ってる
かもしれませんが、エンコードされているのはjisなのか
sjisなのかeucなのか、またそれぞれ2バイトで1文字を
表すのか、あるいはKANJI-IN、KANJI-OUT的な構成を
しているのか、ってことで処理がわかれてくるのでは
ないかと。

# jperlならsubstr($str,文字数)=""で日本語を切れるようですが。

B-Cus 1998/01/29(木) 23:49:08
> んーと、%[0-9A-Z][0-9A-Z]でないですかね?

16進だから%[0-9A-F][0-9A-F]でしたね(^^;

片松祐司 [E-Mail] 1998/01/30(金) 01:54:42
>Explorerにも対応させるためには,escape関数(http://www.tohoho-web.com/wwwjsref.htm#Builtin)を使ってMIMEエ
>ンコードして,1Byteずつループで見ていかなければならないのでしょうか。めんどくさーい。
こういう事ですね?

<SCRIPT LANGUAGE="JavaScript">
<!--
function kazoeru(){
dmy = escape(document.f1.ta1.value);
dlen = dmy.length;
moji = 0;
for(i=0;i<dlen;i++){
if(dmy.charAt(i) == "%") { i=i+2; }
moji++;
}
alert(moji+"文字");
}
//-->
</SCRIPT>
<FORM NAME="f1">
<TEXTAREA NAME="ta1" onChange="kazoeru()"></TEXTAREA>
</FORM>

#ちなみに…ご指摘通り、改行コードによって出てくる文字数が違います。

TH 1998/01/30(金) 15:02:09
:B-Cusさん
>16進だから%[0-9A-F][0-9A-F]でしたね(^^;
失礼しました。
 …7bitアスキー文字以外は %(16進数2文字)という構成になってる…
と書いたつもりだったんですが、なんかかぶってましたね。

で、私が言いたかったのは(あまり知識もないし、深く考えてないですが)
先頭から%か否かで判断させて%なら1文字分(2 Byte)カウンタをあげて…
っていう原始的な方法です。

:hiro-kimさん
>Explorer4では1文字としてカウントしますね。
え〜!!そうなんですか、IE3.x のときってちゃんと? length
って使えてましたよね?(あまり自信はないけど…)
# 実はアンチM○なんで、IE は使ってない

miyasiro 1998/01/30(金) 22:13:03
>先頭から%か否かで判断させて%なら1文字分(2 Byte)カウンタをあげて…
7bitアスキー文字でも、% や + 等の記号と制御文字は%[0-9A-F][0-9A-F]に
エンコードされるので、先頭が%なら1文字分(2 Byte)カウンタを上げるという
だけでは問題ありそうです。
それから、B-Cus さんも仰ってるように、日本語文字コードによっては、1文字分が
2 bytes と決め付ける訳にもいきません(EUC では 3 bytes 文字があるそうですし、
JIS だとKANJI-IN,OUT を除外して数える必要があります)。
でも、CGI 内部で jcode.pl により、文字コードを例えば S-JIS に統一しておけば、
比較的簡単に文字境界を見つけることはできると思います。

>え〜!!そうなんですか、IE3.x のときってちゃんと? length
>って使えてましたよね?(あまり自信はないけど…)
うちの IE3.02(Windows95) では、"漢字".length == 2 となります。

takagi7 [E-Mail] [HomePage] 1998/02/02(月) 10:26:05
[[解決]]
Shift JISコード用のTESTAREAの入力文字列長(半角/全角対応、IE/ネスケ対応)をチェックするJavaScriptをもっています。入力長オーバーであれば、alert文でエラーメッセージを表示します。連絡頂ければ差し上げます。

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