• ベストアンサー

入力されたテキストを変換したい

FLASH 8を使用しています。 テキスト入力で入力されたテキストを変換できないかと考えています。 例えば、テキスト入力で半角数字で入力されたテキストを フレームを移動した際に漢数字に変換するなど。 FLASH単独では難しいでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • perse
  • ベストアンサー率74% (113/152)
回答No.2

置換なら簡単に出来ますが、変換となると難しいですね。 #1さんの >◎ 配列を使ったスクリプト2 で使っているsplitとjoinを使って置換するならこんな感じです。 //「雪」を「晴れ」に置換 hoge_str = "今日の天気は雪です"; ret_str = hoge_str.split("雪").join("晴れ"); trace(ret_str); 配列を使えば一度に置きかえれます //置換対象の文字列 target_array = new Array("1", "2", "3"); //置換後の文字列 replace_array = new Array("一", "二", "三"); hoge_str = "1234567890"; for (var i = 0; i<target_array.length; i++) { hoge_str = hoge_str.split(target_array[i]).join(replace_array[i]); } trace(hoge_str); // 一二三4567890 このやり方を使えば全角ひらがな→全角/半角カタカナとかも出来なくもないです。 target_array = new Array("あ", "い", "う"); replace_array = new Array("ア", "イ", "ウ"); と、全部書かないといけませんが。文字コードを使えばもうちょっと楽にできるかも。

teke-teke
質問者

お礼

ありがとうございます。 変換じゃなくて、置換です。 半角カタカナ→全角カタカナも使用したいと思ってました。 試してみます。

その他の回答 (1)

noname#35109
noname#35109
回答No.1

変換と言っても, 色々ありますから一概には言えませんが, 半角数字で入力されたテキストを漢数字に変換することぐらいでしたら, Flash単独で "しない" 方が難しいでしょう。 つまり,Flash単独で簡単にできますよ。 半角数字→漢数字 というのは変換というより置換ですよね。 IME や ATOK などの変換ソフトない環境のPCで, Flash の テキストフィールドに英数文字を入力して, その入力したテキストを入力する端から IME や ATOK などのように日本語変換するのなら, おそらく Flash では無理に近いと思います。 しかし,半角数字→漢数字 というような, 単なる文字置換や文字列置換,文字列操作は, どちらかと言うと Flash というソフトは,かなり得意としている分野だと思います。 おそらく他の言語より楽にできると思います(多分)。 また,メモ帳 や Word などの置換機能を使うより, Flash で置換プログラムを自作して組んだ方が,置換スピードも速い気がします。 (ただ,Flash は長文の処理には弱いです。途中で止まることがあります。) Flash による方法も考えれば考えるほど また組み合わせも考え合わせると無数にあると思いますが, 一応,3つほどスクリプトを考えてみました。 3つともメインムービー(_root)のステージ上に, 「in_txt」 という "変数名" のテキスト入力のテキストフィールドと, 「out_txt」 という "変数名" のダイナミックテキストのテキストフィールドと, 置換するスクリプトを書いたボタンを用意した場合です。 ◎ 普通に考えたらできるスクリプト 「in_txt」内の文字列を, 1文字目から最終文字まで順に1文字ずつ見ていって, もし,0~9 のどれかの場合のみ,零~九 に置換する方法です。 つまり,人間が普通に手作業でする方法をを Flash にさせる方法です。 ※インデントを付けるため,  スクリプトの各行の前には全角空白文字を  たくさん入れています。  そのままコピペされとシンタックスエラーに  なりますので,全角空白文字を半角空白文字などに  置換するか削除などして使用してください。 /////////////////////////////////////////////////////// on (release) {   //_root.out_txt の初期化   _root.out_txt = "";   // 変数in_len に in_txt の文字数を取得   in_len = _root.in_txt.length;   // in_len まで i を加算しながらループ   for (i=0; i<=in_len-1; i++) {     // 変数in_str に in_txt の i 番目の文字を代入     in_str = _root.in_txt.substr(i, 1);     // in_str が数字なら out_str に漢字を代入     if (in_str == "0") {       out_str = "零";     } else if (in_str == "1") {       out_str = "一";     } else if (in_str == "2") {       out_str = "二";     } else if (in_str == "3") {       out_str = "三";     } else if (in_str == "4") {       out_str = "四";     } else if (in_str == "5") {       out_str = "五";     } else if (in_str == "6") {       out_str = "六";     } else if (in_str == "7") {       out_str = "七";     } else if (in_str == "8") {       out_str = "八";     } else if (in_str == "9") {       out_str = "九";     } else {       out_str = in_str;     }     // out_txt に out_str を加算     _root.out_txt += out_str;   } } /////////////////////////////////////////////////////// ◎ 配列を使ったスクリプト1 大筋は上の方法と同じです。 上の方法だと if文 がやたら長くなるので, 零~九 を配列に入れて,1つの if文 だけで済ませる方法です。 ※同じく,コピペする場合は全角空白文字を   半角空白文字などに置換してください。 /////////////////////////////////////////////////////// on (release) {   //_root.out_txt の初期化   _root.out_txt = "";   //配列 change_arr を作成   change_arr = new Array("零","一","二","三","四","五","六","七","八","九");   // 変数change_len に change_arr の要素(エレメント)数を取得   change_len = change_arr.length;   //配列 in_arr を作成   in_arr = new Array();   // in_txt を1文字ずつバラバラにして in_arr に代入   in_arr = _root.in_txt.split("");   // 変数in_len に in_arr の要素数を取得   in_len =_root.in_txt.length;   // in_len を 1文字ずつ変換   for(i=0;i<=in_len-1;i++){     out_str = in_arr[i];     for(j=0;j<=change_len-1;j++){       if(in_arr[i] == j){         out_str = change_arr[j]       }     }   // out_txt に out_str を加算   _root.out_txt += out_str;   } } /////////////////////////////////////////////////////// ◎ 配列を使ったスクリプト2 データの形は「配列を使ったスクリプト1」に似ていますが, 方法は上のと全然違います。 人間が手作業するなら普通はこんな風にはしない方法です。 「in_txt」内の文字列を, 例えば "0" なら "0" で split (分割)して配列に代入し, その split したものを join(連結)させるときに,"零" を挟み込んで連結させるという方法です。 ※同じく,コピペする場合は全角空白文字を   半角空白文字などに置換してください。 /////////////////////////////////////////////////////// on (release) {   //_root.out_txt の初期化   _root.out_txt = "";   //とりあえず 変数in_txt を 変数out_txt に確保   _root.out_txt = _root.in_txt;   //配列 change_arr を作成   change_arr = new Array("零", "一", "二", "三", "四", "五", "六", "七", "八", "九");   // 変数change_len に change_arr の要素数を取得   change_len = change_arr.length;   for (i=0; i<=change_len-1; i++) {     //配列 in_arr を作成     in_arr = new Array();     // i で split して in_arr に代入     in_arr = _root.out_txt.split(i);     // change_arr[i] をはさんで in_arr の要素を連結     _root.out_txt = in_arr.join(change_arr[i]);   } } /////////////////////////////////////////////////////// 文字数にもよりますけど, 少ない文字数ならどれでも良いのではないでしょうか。 一応,最後の 「配列を使ったスクリプト2」 がお薦めです。 なお,上記3つとも,「in_txt」 内の文字列に, 改行や日本語など, 0~9 以外の文字が入っていても大丈夫です。 また,一応 Flash MX 以降では動作確認済みです。 *** 動作速度確認実験 *************** 「Bad Astronomy and Universe Today Forum」 http://www.bautforum.com/showpost.php?s=43a5b50feff44797150355e3a3f0cf51&p=118223&postcount=93 上のURLに, 実験にはちょうど長さ良さそうな円周率を書いてくれている方がいましたので, 上のURLの円周率を全てコピペで,「in_txt」 に貼り付けて実験してみました。 (3.14… …637568 :改行・空白スペース含む 1万257文字) 速さで言うと, 一番下の 「配列を使ったスクリプト2」 がやはり最も早いと思います。 Flash 8 Player(スタンドアローン) だと, 3つのスクリプトとも,どれも止まらずに最後まで置換されました。 しかし,Flash 6 Player(スタンドアローン) だと, 上の2つ(「普通に考えたらできるスクリプト」 と 「配列を使ったスクリプト1」)は, 途中で計算が止まり, 「ムービー内のスクリプトが原因で Macromedia Flash Player 6 の実行速度が遅くなっています。このまま継続すると,応答しなくなることがあります。スクリプトの実行を中止しますか?」 という警告メッセージが出てきてしまいました。 「いいえ」を選択すると一応はちゃんと置換されたのですが,あまり良い状態とは言えません。 一番下の 「配列を使ったスクリプト2」 は FlashPlayer6でも何ごともなくサッと置換されました。 *********************************** まだまだ方法はあると思います。 ひょっとしたら,他の方がもっと良い方法や面白い方法なども書いてくださるかもしれません。 また,いろいろ考えてみるのも面白いと思います。 >> フレームを移動した際に漢数字に変換するなど この フレームを移動 は特に深く説明しなくて良いですよね。 例えば,フレーム1 に 「in_txt」 という "変数名" のテキスト入力のテキストフィールドと, 置換するスクリプトを書いたボタンを用意し, フレームに stop(); と書いて止めて置いて, ボタンに _root.gotoAndStop(2); でも追加して, 「out_txt」 という "変数名" のダイナミックテキストのテキストフィールドを, フレーム2 に配置すれば,置換&フレーム移動もできます。

teke-teke
質問者

お礼

ありがとうございます。 確かに…、変換じゃなくて置換です。 当方初心者なので、上記を試すのに時間がかかってしまいます。 すべて試してみたいと思います。

関連するQ&A

専門家に質問してみよう