トップへ戻るニュースフォーラムFLASH-ML 過去ログBak@Flaダウンロードよくある質問と答
ログイン
ユーザ名:

パスワード:


パスワード紛失

新規登録
メインメニュー
メイン
   コーダーズルーム【スクリプト系】
     半角変換について
投稿するにはまず登録を

スレッド表示 | 新しいものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
raptor
Åê¹ÆNo.15850
投稿日時: 2005-3-9 13:47
新米
居住地: 福岡。でも大阪
投稿: 16
使用環境:
半角変換について
外部データなどで読み込んだ数値や英文字を全角→半角に変換すると
言ったASがFlashには無いですが皆さんはどのようにされているので
しょうか?

Flash上で相手に入力してもらう際には文字オプションで入力できる
文字を指定しているのですがcsv等で外部からデータを取り込む際に
どうしても入力ミスなどで全角の英数文字が入ってしまう可能性が
あるのでなにかよい方法が無いかと思っているのですが。

今のところは手動で確認していますがASで制御できる方法などをご存
知でしたらアドバイスお願いします。
A_ikawa
Åê¹ÆNo.15852
投稿日時: 2005-3-9 14:56
新米
居住地: 埼玉県__居心地と読んでいました...。
投稿: 19
使用環境:
Re: 半角変換について
はじまして。

csvがなんであるかわからず、用語辞典で検索した未熟者ですが、
要するに、swfファイルに読みこまれたテキストデータの中に
全角英数が入っていた場合に半角に変換する方法だと解釈させて
もらってscriptを組んでみました。

スクリプトは、改変して上に記述しました。

とりあえず、読み込まれたテキストデータをmsgとして、check_msg()でmsg_setとして返す処理を行っています。




----------------
[color=#0066ff]aikawa[/color]

Fla4man
Åê¹ÆNo.15856
投稿日時: 2005-3-9 17:25
職人
居住地: かまくら
投稿: 517
使用環境:
Re: 半角変換について
String.fromCharCodeの逆が現在どういう関数なのか知らないのですが
その逆のOrd相当の関数ないしはOrdが使えるので
いちいち比較するのではなくて

msg.substr(i, 1);

で取得したコードをそのOrd相当の関数にかけて1byteなら半角です。
数字から英文字は16進で30から7Aなので
で16進で30から7Aだったら(コード-$30) してやって
対応する配列からダイレクトでとる方法のほうがよいように思います。

Flash6 フォーマットのSWFは探索しやすい2バイトユニコードではなくて
UTF-8を使っているようです。
UTF-8は内部でもASCIIは1バイトコードを使っているので
関数としてはS-JIS(=Flash5以前と共通)の一般的な方法が使えると思います。

文字変換はFlashでほぼなんでもできないことは無いと思うけれど
一般的なプログラミングで与えられているところのユニコードマルチバイト変換関数が与えられていないので
基本的にやらないのが吉だとおもいます。

もしやりたい場合はユニコード漢字配列は応用すると難しいので
コードページをS-JISにしておいてURLエンコしたデータを扱うか
エンコ用にF5以前のヘッダーのものを小MCとしてロードするほうが
JIS順に並んでいるもののあつかいは楽だとおもいます。

------
修正
UンコしなくてもcodepagetrueならばSJISコードを取得できるようです。


----------------
通常のハンドル名:×○○× ねた回収モードに突入 現在1/100

A_ikawa
Åê¹ÆNo.15864
投稿日時: 2005-3-9 18:47
新米
居住地: 埼玉県__居心地と読んでいました...。
投稿: 19
使用環境:
Re: 半角変換について
fla4manさんの指摘通り、流石に一つ一つ、調べる方法はあまりに効率が悪いので、
charCodeAtを利用して、自分なりに少しだけ改変してみました。
function init() {
	char_set1 = ["A", "B", "C", "D", "E", "F", "G", "H", "I", "J","K", "L",	 "M",
		"N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"];
	char_set2 = ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m",
		 "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z"];
	num_set = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9"];
}
//
function check_msg() {
	msg_set = "";
	//
	for (i=0; i<msg.length; i++) {
		word = msg.substr(i, 1);
		leng = String(word.charCodeAt(0));
		//全角、半角判定
		if (leng.length>3) {
			change_word();
			//
		}
		msg_set += word;
	}
	//
}
//
function change_word() {
	//全角大文字、小文字判定
	for (j=0; j<char_set1.length; j++) {
		var char1 = char_set1[j];
		var char2 = char_set2[j];
		//
		if (word == char1) {
			word = String.fromCharCode(65+j);
		} else if (word == char2) {
			word = String.fromCharCode(97+j);
		}
	}
	//数字判定
	for (k=0; k<num_set.length; k++) {
		var num = num_set[k];
		if (word == num_set[k]) {
			word = k;
		}
	}
}
init();
//
※読み込まれたテキストデータをmsgとして、check_msg()でmsg_setとして返す処理を行っています。

とりあえず、全角以外は、逐一判定する手間は、省きました。
自分には、この辺が精一杯なので、より効率的に記述できる方お願いします。





----------------
[color=#0066ff]aikawa[/color]

yoshiweb
Åê¹ÆNo.15877
投稿日時: 2005-3-10 16:34
新米
居住地:
投稿: 6
使用環境:
Re: 半角変換について
ActionScriptはJavaScriptと似ているので、以下のサイトのJavaScriptを流用できそうです。

AOK's JavaScript Library - 全角英数字・記号を半角に置換
Fla4man
Åê¹ÆNo.15920
投稿日時: 2005-3-11 17:09
職人
居住地: かまくら
投稿: 517
使用環境:
Re: 半角変換について
最初の私のレスが悪かったためちょっと誤解を与えてしまったようです。
Aikawaさんのコードのleng.lengthは必ず1になるはずです。
MXの場合ないしはSWF5以前はUsecodepageをTrueにすると
英語がきた場合
length(word)は1
UsecodepageをFalseは
length(word)は2になります。
しかしどちらの値も10進で32-126になるはずです。

元投稿者がどこまで全角に変換したかったかわからないのですが
配列方式の場合変換したくない場合は値に半角文字を入れておけばいいだけのはなしです。

全角文字にするというのはいわば「コード」から「図記号」への変換で
後の処理を考えると意味があります。
逆は用途別では無いでしょうか

Aikawaさんのコードを引用し修正すると

function init() { char_set1 = [
" ","!","”","#","$","%","&","’","(",")","*","+",",","?",".","/","0","1","2","3"
,"4","5","6","7","8","9",":",";","<","=",">","?","@","A","B","C","D","E","F","G"
,"H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z","["
,"¥","]","^","_","‘","a","b","c","d","e","f","g","h","i","j","k","l","m","n","o"
,"p","q","r","s","t","u","v","w","x","y","z","{","|","}","―"
];}
//もしも英語セットにしたいならば
//"¥"を"\"に、"―"を"?"に
function check_msg() {
msg_set = "";
//
for (i=0; i<msg.length; i++) {
word = msg.substr(i, 1);
code = String(word.charCodeAt(0));
//全角、半角判定 と変換
if ((code>=32) and (code=<126)) {
word=char_set1[code-32];
//
}
msg_set += word;
}
//

でいいのではないかと思います。
この方法は文字コードやcodepageと関係なくうまく動くはずです。

JavaScriptのリンク先の内容は逆でかつ不完全です。
JISコードではそもそも数字とアルファベットの位置はそこそこASCIIコード順なのですが
記号は一区にバラけています。

現実問題として文字コード変換の最適化はこだわらないならそんなに
コストをかけるだけ無駄です。

現実問題として今後文字コード変換をしたいという需要が出るのは
大学とか企業とかですでに膨大なEUCやISO2022のHTMドキュメントがあり
それをloadvars.ondataで読み取り変換するときぐらいだとおもいます。
又現状FlashPlayerはローカルからのセキュリティがマ社の言うポリシーと矛盾しており「非常に使える状態」
なのでプロジェクターやローカルダウンロードしたSWFから
インターネット上の全てのテキストドキュメントを読み込むことが出来
つまりそういうときにはEUCのドキュメントを変換したいと思うケースも出てくると思います。

そうした場合ユニコードを使ったコードを使うのは得策では無いです。
せっかくcodepageをTrueにすればSJISで取得できるのだから
コード変換を自前で組む場合はSJISベースで組んだほうがお徳だとおもいます。

蛇足ですが一区はこんなです。

【1区】(記号)
S-JIS   JIS  UniCode 文字

0x8140 0x2121 0x3000  (空白)
0x8141 0x2122 0x3001 、(読点)
0x8142 0x2123 0x3002 。(句点)
0x8143 0x2124 0xFF0C ,(コンマ)
0x8144 0x2125 0xFF0E .(ピリオド)
0x8145 0x2126 0x30FB ・(中点)
0x8146 0x2127 0xFF1A :(コロン)
0x8147 0x2128 0xFF1B ;(セミコロン)
0x8148 0x2129 0xFF1F ?(疑問符)
0x8149 0x212A 0xFF01 !(感嘆符)
0x814A 0x212B 0x309B ゛(濁点)
0x814B 0x212C 0x309C ゜(半濁点)
0x814C 0x212D 0x00B4 ´(アクサンテギュ)
0x814D 0x212E 0xFF40 `(アクサングラープ)
0x814E 0x212F 0x00A8 ¨(ウムラウト)
0x814F 0x2130 0xFF3E ^(アクサンシルコンフレックス)
0x8150 0x2131 0xFFE3  ̄(オーバーライン)
0x8151 0x2132 0xFF3F _(アンダーライン)
0x8152 0x2133 0x30FD ヽ(片仮名繰返し記号)
0x8153 0x2134 0x30FE ヾ(片仮名繰返し記号濁点)
0x8154 0x2135 0x309D ゝ(平仮名繰返し記号)
0x8155 0x2136 0x309E ゞ(平仮名繰返し記号濁点)
0x8156 0x2137 0x3003 〃(同じく記号)
0x8157 0x2138 0x4EDD 仝(同上記号)
0x8158 0x2139 0x3005 々(繰返し記号)
0x8159 0x213A 0x3006 〆(しめ)
0x815A 0x213B 0x3007 〇(漢字ゼロ)
0x815B 0x213C 0x30FC ー(長音記号)
0x815C 0x213D 0x2015 ―(ダッシュ)
0x815D 0x213E 0x2010 ‐(ハイフン)
0x815E 0x213F 0xFF0F /(斜線)
0x815F 0x2140 0x005C \(逆斜線)
0x8160 0x2141 0x301C ?(波ダッシュ)
0x8161 0x2142 0x2016 ?(双柱)
0x8162 0x2143 0xFF5C |(縦線)
0x8163 0x2144 0x2026 …(三点リーダ)
0x8164 0x2145 0x2025 ‥(二点リーダ)
0x8165 0x2146 0x2018 ‘(左シングル引用符)
0x8166 0x2147 0x2019 ’(右シングル引用符、アポストロフィー)
0x8167 0x2148 0x201C “(左ダブル引用符)
0x8168 0x2149 0x201D ”(右ダブル引用符)
0x8169 0x214A 0xFF08 ((始め小括弧)
0x816A 0x214B 0xFF09 )(終り小括弧)
0x816B 0x214C 0x3014 〔(始め亀甲括弧)
0x816C 0x214D 0x3015 〕(終り亀甲括弧)
0x816D 0x214E 0xFF3B [(始め大括弧)
0x816E 0x214F 0xFF3D ](終り大括弧)
0x816F 0x2150 0xFF5B {(始め中括弧)
0x8170 0x2151 0xFF5D }(終り中括弧)
0x8171 0x2152 0x3008 〈(始め山括弧)
0x8172 0x2153 0x3009 〉(終り山括弧)
0x8173 0x2154 0x300A 《(始め二重山括弧)
0x8174 0x2155 0x300B 》(終り二重山括弧)
0x8175 0x2156 0x300C 「(始めかぎ括弧)
0x8176 0x2157 0x300D 」(終りかぎ括弧)
0x8177 0x2158 0x300E 『(始め二重かぎ括弧)
0x8178 0x2159 0x300F 』(終り二重かぎ括弧)
0x8179 0x215A 0x3010 【(始めすみ付き括弧)
0x817A 0x215B 0x3011 】(終りすみ付き括弧)
0x817B 0x215C 0xFF0B +(正符号、加算記号)
0x817C 0x215D 0x2212 ?(負符号、減算記号)
0x817D 0x215E 0x00B1 ±(正又は負符号)
0x817E 0x215F 0x00D7 ×(乗算符号)
0x8180 0x2160 0x00F7 ÷(除算符号)
0x8181 0x2161 0xFF1D =(等号)
0x8182 0x2162 0x2260 ≠(等号否定)
0x8183 0x2163 0xFF1C <(不等号、より小)
0x8184 0x2164 0xFF1E >(不等号、より大)
0x8185 0x2165 0x2266 ≦(より小さいか 又は 等しい)
0x8186 0x2166 0x2267 ≧(より大きいか 又は 等しい)
0x8187 0x2167 0x221E ∞(無限大)
0x8188 0x2168 0x2234 ∴(ゆえに)
0x8189 0x2169 0x2642 ♂(雄記号)
0x818A 0x216A 0x2640 ♀(雌記号)
0x818B 0x216B 0x00B0 °(度)
0x818C 0x216C 0x2032 ′(分)
0x818D 0x216D 0x2033 ″(秒)
0x818E 0x216E 0x2103 ℃(セ氏度記号)
0x818F 0x216F 0xFFE5 ¥(円記号)
0x8190 0x2170 0xFF04 $(ドル記号)
0x8191 0x2171 0x00A2 ?(セント記号)
0x8192 0x2172 0x00A3 ?(ポンド記号)
0x8193 0x2173 0xFF05 %(パーセント)
0x8194 0x2174 0xFF03 #(番号記号)
0x8195 0x2175 0xFF06 &(アンパサンド)
0x8196 0x2176 0xFF0A *(アステリスク)
0x8197 0x2177 0xFF20 @(単価記号)
0x8198 0x2178 0x00A7 §(セクション記号)
0x8199 0x2179 0x2606 ☆(白星)
0x819A 0x217A 0x2605 ★(黒星)
0x819B 0x217B 0x25CB ○(白丸)
0x819C 0x217C 0x25CF ●(黒丸)
0x819D 0x217D 0x25CE ◎(二重丸)
0x819E 0x217E 0x25C7 ◇(菱形)


----------------
通常のハンドル名:×○○× ねた回収モードに突入 現在1/100

A_ikawa
Åê¹ÆNo.15924
投稿日時: 2005-3-11 20:29
新米
居住地: 埼玉県__居心地と読んでいました...。
投稿: 19
使用環境:
Re: 半角変換について
>>fla4manさんへ
…、…、…、えっと話が逆転してしまっているようです。
(あれ???と、いう感じです。)

投稿者の方は、多分、「半角」を「全角」にしたいと記述しているのではなく、
「全角」を「半角」にしたいと記述している思われます。

fla4manさんのスクリプトの記述の内容を見ると、やっぱり
全角変換になってます…。

後、単なる記述ミスかもしれませんが、codeとchar_set1の位置関係がずれてます。
char_set1[c_ode]  >>  char_set1[(c_ode-32)]
としないと正しい変換値にならないですね…。

引用:
コードのleng.lengthは必ず1になるはずです。
MXの場合ないしはSWF5以前はUsecodepageをTrueにすると
英語がきた場合
length(word)は1
UsecodepageをFalseは
length(word)は2になります。
しかしどちらの値も10進で32-126になるはずです。
の件ですが、

charCodeAt()は、文字を数値に置き換える関数ですから、
leng =String(word.charCodeAt(0))とした場合、
leng には、
wordが半角の場合、32から123までの数値を『文字列』に置き換えた値、
全角の場合は、全角の『AからZ』、『aからz』、『0から9』(文字を限定してますが)
までの数値を『文字列』に置き換えた値が入るはずです…。
(文字コードで出力させた結果、全角はどの値も『653○○』という五桁の数になりました。)
だから、leng >3 とする事で全角、半角判定はとりあえずは妥当なものになるはずです。


それに、してもすごい話です。
話のベクトルが、どこか違うところに飛んでて、読んでてフラフラします。

-------------------------------------------------------------
>> それとなく投稿者の方へ

これは、投稿者の投稿文をよくよく読んでみて、自分でもよくわからなく
なってしまった事なのですが、
引用:
外部データなどで読み込んだ数値や英文字を全角→半角に変換すると
言ったASがFlashには無いですが皆さんはどのようにされているので
しょうか?

ここだけ読むと、
外部データをswfファイルに読み込みたい、と受け取れます。
引用:
Flash上で相手に入力してもらう際には文字オプションで入力できる
文字を指定しているのですがcsv等で外部からデータを取り込む際に
どうしても入力ミスなどで全角の英数文字が入ってしまう可能性が
あるのでなにかよい方法が無いかと思っているのですが。


ここを読むと、逆に、
swfファイルから入力した文字を、外部ファイルに送りたい、とも受け取れます。


実際どちらなのか、投稿者の方が登場してくれないのでわかりかねます…。
(どちらの場合も、基本的なスクリプトは、同じになるとは思いますが。)





----------------
[color=#0066ff]aikawa[/color]

Fla4man
Åê¹ÆNo.15925
投稿日時: 2005-3-11 23:12
職人
居住地: かまくら
投稿: 517
使用環境:
Re: 半角変換について
すみません。
確かに話が逆になってしまいました。

あわせて
code-32
も指摘の通りです。(修正前後に指摘されてしまったようです。)


leng.length>3の主旨もわかりました。
これも捉えどころを間違ったようです。

しかしまぁ。
Win用でこのてのものは嫌って程やっているのにとんだボケかましました。

とするとリンクにあったJavascriptのコードあたりで
大体事足りるのではないかと思います。

一応三区も載せておきます
【3区】(英数字)
S-JIS   JIS  UniCode 文字

0x824F 0x2330 0xFF10 0
0x8250 0x2331 0xFF11 1
0x8251 0x2332 0xFF12 2
0x8252 0x2333 0xFF13 3
0x8253 0x2334 0xFF14 4
0x8254 0x2335 0xFF15 5
0x8255 0x2336 0xFF16 6
0x8256 0x2337 0xFF17 7
0x8257 0x2338 0xFF18 8
0x8258 0x2339 0xFF19 9
0x8260 0x2341 0xFF21 A
0x8261 0x2342 0xFF22 B
0x8262 0x2343 0xFF23 C
0x8263 0x2344 0xFF24 D
0x8264 0x2345 0xFF25 E
0x8265 0x2346 0xFF26 F
0x8266 0x2347 0xFF27 G
0x8267 0x2348 0xFF28 H
0x8268 0x2349 0xFF29 I
0x8269 0x234A 0xFF2A J
0x826A 0x234B 0xFF2B K
0x826B 0x234C 0xFF2C L
0x826C 0x234D 0xFF2D M
0x826D 0x234E 0xFF2E N
0x826E 0x234F 0xFF2F O
0x826F 0x2350 0xFF30 P
0x8270 0x2351 0xFF31 Q
0x8271 0x2352 0xFF32 R
0x8272 0x2353 0xFF33 S
0x8273 0x2354 0xFF34 T
0x8274 0x2355 0xFF35 U
0x8275 0x2356 0xFF36 V
0x8276 0x2357 0xFF37 W
0x8277 0x2358 0xFF38 X
0x8278 0x2359 0xFF39 Y
0x8279 0x235A 0xFF3A Z
0x8281 0x2361 0xFF41 a
0x8282 0x2362 0xFF42 b
0x8283 0x2363 0xFF43 c
0x8284 0x2364 0xFF44 d
0x8285 0x2365 0xFF45 e
0x8286 0x2366 0xFF46 f
0x8287 0x2367 0xFF47 g
0x8288 0x2368 0xFF48 h
0x8289 0x2369 0xFF49 i
0x828A 0x236A 0xFF4A j
0x828B 0x236B 0xFF4B k
0x828C 0x236C 0xFF4C l
0x828D 0x236D 0xFF4D m
0x828E 0x236E 0xFF4E n
0x828F 0x236F 0xFF4F o
0x8290 0x2370 0xFF50 p
0x8291 0x2371 0xFF51 q
0x8292 0x2372 0xFF52 r
0x8293 0x2373 0xFF53 s
0x8294 0x2374 0xFF54 t
0x8295 0x2375 0xFF55 u
0x8296 0x2376 0xFF56 v
0x8297 0x2377 0xFF57 w
0x8298 0x2378 0xFF58 x
0x8299 0x2379 0xFF59 y
0x829A 0x237A 0xFF5A z

この部分についてはASCIIと位置があっていて途中に余計なコードは無いので
codepage=false(UTF8読み込み後)ならば
code - 65248 (0xFEE0)
codepage=true(SJIS読み込み)ならば
code -8960(0x2300)

あと必要に応じて記号を変換すればよいのでは無いかと思います。


----------------
通常のハンドル名:×○○× ねた回収モードに突入 現在1/100

raptor
Åê¹ÆNo.16227
投稿日時: 2005-3-24 14:56
新米
居住地: 福岡。でも大阪
投稿: 16
使用環境:
Re: 半角変換について
いろいろアドバイスありがとうございます。

逐次変換する方法は以前に試したことはあるのですが文字数が
少ないときにはいいのですが大量にということになるとちょっと
って感じでした。
今回のコンテンツを作るに当たって外部のCSVから少なくとも3000文字
以上は読み込む必要があってその中の全角の英数字を半角にどうか
ASで簡単に処理できないものかと思ったのですが・・・。

やはりASで処理するよりはエクセルで入力する際にチェックをかけて
処理するほうが効率的な感じですね。

アドバイスいただいた方々ありがとうございました。
今後のコンテンツ作成の良い参考になりました。
スレッド表示 | 新しいものから 前のトピック | 次のトピック | トップ

投稿するにはまず登録を
 
Copyright (C) 2003 FLASH-japan. All rights reserved.
Powered by Xoops