Javascript:5Cなどの文字列操作の問題を回避するには

[上に] [前に] [次に]
K [E-Mail] 1998/09/02(水) 11:51:41
はじめましてKと言います。
formで入力された全角文字でデータベース(と言っても大きなストリング)
を検索しURLを表示するscriptを製作中です。問題点は
「表」や「ソ」などの5cを含む文字が入力されると文字列操作
(substringやdocument.write、ストリングスの結合)などが旨く
動作しないことです。(ブラウザ:NN3.0など)。
document.writeについては\を後に入れることで回避できます。
そこで入力文字列に「表」や「ソ」など含む場合、¥を挿入するscript
を考えましたがこれ自身が上手く動きません。
どういう方法が考えられますでしょうか。

SHUICHI.T [E-Mail] [HomePage] 1998/09/02(水) 12:08:39
ShiftJIS をやめて EUC で HTML ソースを書くと言う方法がありますね。
(EUC だと2バイト文字の2バイト目が \ になることはない)

K 1998/09/02(水) 13:25:48
>SHUICHIさん
EUCでHTMLソースを書くと、formで入力された文字列もjavascriptは
EUCで受け取ることになるのでしょうか。

SHUICHI.T [E-Mail] [HomePage] 1998/09/02(水) 13:44:25
まず、そのフォームはどんなふうになっているのですか?
(CGI なのかどうか?)
検索フォームのようなので CGI を使うとは思いますが...

1998/09/02(水) 17:42:56
>SHUCHIさん
CGIは一切使用しません。formは下記のようなごく普通のものです。
関数kensakuの中でkeywordの値を取得します。

<form name="xxx">
キーワード<input type="text" size="20" name="keyword">
<input type="button" value="検索する" onClick="kensaku(this.form)">
</form>

mura [E-Mail] 1998/09/02(水) 21:29:47
比較をするなら双方をescape()するだけで済む問題かもしれませんね。

\挿入スクリプトは私が似たようなものを作っているので書いておきます。

●schstrを見つけたら後ろにaddstrを加える関数(引数はすべてescape()した形で指定)
function strsearchadd(txt, schstr, addstr) {
var len;
var ret='';
var i;
len=schstr.length;
while((i=txt.indexOf(schstr))>-1) {
  ret += txt.substring(0,i+len) + addstr;
  txt = txt.substring(i+len);
}
return(ret + txt);
}

●関数の使用例(\を見つけたらもう1つ\を付加する)
document.write(unescape(strsearchadd(escape(変換対象文字列), '%5C', '%5C')));


余談ですが私の場合、EUCで書いたページからJavaScriptで
他のウィンドウにフォーム内容をdocument.writeすると
NN3・NN4で文字化けが起こりました。(Win95のみで確認)
なぜか%8Eが原因のようで、
strsearchadd(escape(変換対象文字列), '%8E', '%8E') で回避しました。

mura [E-Mail] 1998/09/02(水) 21:32:15
>比較をするなら双方をescape()するだけで済む問題かもしれませんね。

そう言えば文字コードは問題ないのでしょうか?
SJISだとしたらSJISだけが入るのでしょうか。
#文字コードが複数あればJavaScriptだけでは処理は難しいですね。忘れてました。

[E-Mail] [HomePage] 1998/09/03(木) 22:32:53
[[解決]]
escape()にヒントを得て良く考えたら解決しました。
コメントを頂いた方ありがとうございました。

作ろうとしていたた検索機能のscriptはデータベースとしての
文字列stringsとformから入力されるstringsの一致を調べるものでした。
一方このscriptを組む段階ではformから入力stringsの代わりに
直接文字を記述したstringsを使用して確認していました。
その結果 keyword="サクラソウ" としたとき
document.write(escape(keyword)で見ると
%83T%83N%83%89%83%83Eが表示され(ASCIIはそのまま文字で表示される)
サ  |ク|ラ   |ソ|ウ  となり「ソ」の2バイト目5Cが欠落して
います。そこで5Cを補う方法をお聞きしたのでした。

ところがformからサクラソウと入力されたstringsは
%83T%83N%83%89%83%5C%83E であり5Cが落ちていません!
したがってデータベースとしての文字列の側でソの後に\(5C)を追加
すれば問題なく動作することが分かりました。

完成した検索scriptは http://www.clio.ne.jp/~kuwa/kensaku.htm
にありますので興味ある方はどうぞ。

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