<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文でエラーメッセージを表示します。連絡頂ければ差し上げます。
[上に]
[前に]
[次に]