- ベストアンサー
カタカナの全角と半角が区別されません、、、。
カタカナで入力の際に全角と半角を区別したいのですがどうしたらよいでしょうか? 下記のような数字は全角と半角を区別できるようです。 abc abc 123 123 http://boueki.xsrv.jp/etc/mojisuucount/mojisuuj20dame.html
- みんなの回答 (7)
- 専門家の回答
質問者が選んだベストアンサー
十分というわけではないですが。 function strLength(str){ var matches = str.match(/[\u0020-\u007E\uFF61-\uFF9F]/) || []; return str.length - matches.length / 2; } ================================================= escape について http://www.openspc2.org/JavaScript/escape/index.html
その他の回答 (6)
- TYWalker
- ベストアンサー率42% (281/661)
「勘違いしていたよう」と書かれていたからもう解決されたんですね? ぼくは最初 「このプログラムで半角カナも全角カナも同じ1文字として カウントされるのはなぜか」 というあなたの質問に回答#2でそのまま答えたんですよ。 で、その回答#2への再質問をあなたがされて、 >「%u が現れたら文字数に1を加えてiに3を加えている処理のところ」 >とはどこでしょうか? と聞かれたので、その質問の部分を (あなたがお書きになったプログラムから抜き出して) 回答#4に書いたんですよ。 // から後に質問を書いたのは、 JavaScript は // から後ろが注釈(説明)になるからですよ。 もともとあったプログラムの一部を抜き出して書いたので、 そこをアップして動かしても動かないと思いますよー。 Web で動くプログラムは、 ちょこちょこっと書くと動けるから作ったり、 どっかから拾ってくる人多いんですけど、 どこの誰が使うかわからないので、 よほどの「プロ」でも難しいですよ。 あなたの情報が盗まれたり、 あなたのコンピューターがおかしくされたり、 他人のコンピューターがおかしくなったり、 他人の情報が別の人に行ったりしますよ。 そういう事件がいろいろあるのご存知ですよね。 「こういうものはどこかにないですか」 ということですが、ホントに失礼ですが今のあなたの状態で、 どこかでそれらしいプログラムをもらってきて 世間に公開するのはちょっとあぶないと思いますよ~~。 あなたも「1年ぐらい」とおっしゃってますが、 自分がなにをどうやっているのか分かって、 他の誰からもつけいられない自信がしっかり出来るまでは、 自分でじっくり腰をすえて勉強された方がいいと思いますよ。 JavaScriptは、危険をおかしてインターネットに公開しなくても、 手元で動かせますよ。 あなたの最初のプログラムを、 HTMLごと保存してローカルにおいてダブルクリックして開いたら 動きましたよ。 (当然半角カナも1文字でカウントされるという問題は そのままですが) やさしい本としてはこんなのがありますよ。 http://www.amazon.co.jp/First-JavaScript-%E9%A0%AD%E3%81%A8%E3%81%8B%E3%82%89%E3%81%A0%E3%81%A7%E8%A6%9A%E3%81%88%E3%82%8BJavaScript%E3%81%AE%E5%9F%BA%E6%9C%AC-Michael-Morrison/dp/4873113733
お礼
詳しくまたありがとうございます! 解決はしていないのですが半角カナ認識がこんなに難しいことかと知らず皆様にご迷惑をおかけしてすみません。 自分としては単にモバオークションに出品する際のタイトルを何度も何度も計算しなおして書き直すのが凄い時間がかかったので、個人利用でこういった物があればいいなと思ったんです。 アップロードしなくてもプログラムが動くとは知りませんでした。 また他人の情報が別の人に行ったりと危ないとは知りませんでした。 ここをこう直せば解決ですよ、みたいな簡単なことかと気軽に質問してしまいすみませんでした。
- Werner
- ベストアンサー率53% (395/735)
わざわざescapeした文字列を解析するのって面倒なだけでメリット無くないですか? charCodeAtで文字コード(Unicodeコードポイント)を取得して 場合分けで数え上げるのが素直な方法だと思うのですが。 例えばこんな感じ。 http://www.kanaya440.com/contents/tips/javascript/006.html あと > var strCount = Math.ceil(strLength(str).toString() / 2); ここのtoStringはあっても誤動作はしませんが無駄です。 せっかく文字列にしてるのにすぐ数値演算してるから、 数値→文字列→数値という不必要な変換がされます。
お礼
ありがとうございます! そうなんですかぁ。 皆様プロなのですね。 いろいろ質問して回答いただき更に難しい語句が出てきて更に混乱している自分がいます。 自分で作るのは無理かなぁと、もちろん超勉強して1年後とかに出来るかもしれませんが、、、。生半可な知識でご迷惑をおかけしてすみません。 どこかこのような物を公開しているところなんてないんですかね?
- TYWalker
- ベストアンサー率42% (281/661)
もう解決しているようですが、ご自分で書いたプログラムじゃなかったんですね。 失礼しました。 このプログラムの文字数計算はむちゃくちゃ(不必要に)難しくしているので、削除でいいならそれでいいでしょう。 以下の // 以下に説明を書いて見ました。 せっかく書いたので載せます。 ★ function strLength(strSrc){ len = 0; // 長さを格納する変数、ゼロクリア strSrc = escape(strSrc); // strSrc をエスケープする // strSrc が「abc」だったら「abc」のママ // strSrc が「あいう」だったら「%u3042%u3044%u3046」 // strSrc が「アイウ」だったら「%uFF71%uFF72%uFF73」 // strSrc が「aあア bいイ cうウ」だったら「a%u3042%uFF71 b%u3044%uFF72 c%u3046%uFF73」 for(i = 0; i < strSrc.length; i++, len++){ // i が 0 から srcSrc の長さまで、i と len を1ずつ増やしながら if(strSrc.charAt(i) == "%"){ // srcSrc の i 文字番目が「%」で if(strSrc.charAt(++i) == "u"){ // その次の文字が u だったら半角英数字以外なので i += 3; // 3文字飛ばす(さっき1文字飛ばしているので、結果的に %uxxxx を飛ばして次の字を見に行く) len++; // 長さに1加算する(ここに漢字も全角かなも半角カナも来るので、半角カナも1文字でカウントされる) } i++; // i を 1 加算する(半角全角共通。結果的に半角英数字の場合は i と len が1、それ以外の場合は 2 加算) } } return len; } function showLength( str,name ) { var strCount = Math.ceil(strLength(str).toString() / 2); // さっき strLength で得られた数字を2で割ると、半角は0.5、全角は1になる // unicode 文字コード表 // あ ... 3042 い... 3044 う ... 3046 // ア ... FF71 イ ... FF72 ウ ... FF73
お礼
本当にありがとうございます! そうなんです、自分で作ったわけではなくこちらで拾ったコードを2つ貼り付けてちょっと自分でカスタマイズしてみました。 http://blog.tofu-kun.org/070627210315.php 教えて下さった物の//以下を削除しましてUPしたら http://boueki.xsrv.jp/etc/mojisuucount/mojisuuj20test.html こんな感じになりました。 たぶん全然お話にならないことをしてるんですよね、、、。 ごめんなさい。
補足
あ、勘違いしておりました。 ちょっと頑張ってみます。ありがとうございます!
- fujillin
- ベストアンサー率61% (1594/2576)
こんにちは。 横からですが、先ほどの回答の意味が通じてないみたいなので… 各タグ内に直接onkeyupを指定する方式になさるのであれば、スクリプト内のonload部分(合計約24行分)は不要になります。 ややこしいので、削除しておいたほうが良いでしょう。
お礼
度々ありがとうございます! 不要だったのですね。目からうろこです。 ありがとうございます!
- TYWalker
- ベストアンサー率42% (281/661)
escape関数で、半角英数字(ASCII)は、そのままになり(「aAbBcC」=>「aAbBcC」)その他の字は %uxxxx(xxxx は4桁の16進数、Unicodeコードポイント)になるようです。 半角カナも、全角カナも、%uxxxxになるからそうなるんですね。 半角カナは %uFF61~%uFF9F になるので、その文字が入ってきたら特別な処理をすればいいと思います。 具体的に言うと %u が現れたら文字数に1を加えてiに3を加えている処理のところで、%uFF61~%uFF9Fが来たら特別に文字数を0.5加えることにするとか。
お礼
そんな難しいルールがあるのですね。。。 読んでも難しいのにそれを言葉に出来るなんては凄いです。 ちなみに 「%u が現れたら文字数に1を加えてiに3を加えている処理のところ」 とはどこでしょうか? 具体的な式とか教えて頂くのは無理ですよね。 ご迷惑おかけしてすみません。
- yambejp
- ベストアンサー率51% (3827/7415)
strLength()のフローが半角カタカナに対応してないですね。 まぁ要は手を抜いてるってことです。 厳密にチェックしたいなら、文字コードの制限などを把握しながら ご自身で修正を入れる必要があります。
お礼
なるほど対応してないのですね。 全くどうしてよいのやらわかりませんが修正いれれるようやってみます。 ありがとうございます!
お礼
ありがとうございます!ありがとうございます! ありがとうございます!!!!!! 動きました!!!感動しました、、、、。