• 締切済み

Javaで、半角カナを2バイトとしてカウントしたい

JavaでSJISで入力された文字列(全角、半角、英字、記号等混在)の桁数チェックで、 入力された半角カナのバイト数を、2バイトとみなしてカウントしたいと考えています。 例えば  全角の"テスト"の場合、バイト数は6  半角の"テスト"の場合も、バイト数は6 Javaで以下の様にコーディングしたところ、半角カナ部分はとりあえずうまく行ったのですが、 System.out.println 半角の"テスト".getBytes("EUC-JP").length; ->6 特殊な文字「まるの1、まるの2」等で試すと、特殊な文字のバイト数が1バイトとして カウントされてしまいます。 ※まるの1、まるの2は、この質問フォームで入力できないのでこの記載としています。 以降は(1),(2)と記載します。いずれも全角1文字の文字のことです。 System.out.println "(1)".getBytes("EUC-JP").length;   ->1      ※希望結果は2バイト System.out.println "(2)スト".getBytes("EUC-JP").length;   ->5      ※希望結果は6バイト 特殊な文字「(1)、(2)」や半角カナ(2バイトとしてカウント)を含めて、 簡単にバイト数をカウントすることはできないでしょうか。

  • sepro
  • お礼率47% (23/48)
  • Java
  • 回答数2
  • ありがとう数0

みんなの回答

  • salsberry
  • ベストアンサー率69% (495/711)
回答No.2

> EUC-JPだと対応するものがないので 重箱の隅をつつくと、丸付き数字などの文字はSJIS(=Shift_JIS)にも含まれません。MS932などの独自拡張規格のことも慣習的にSJISと呼ぶことがあるのは確かですが、プログラミングではSJISとMS932の区別をしっかりつける必要があります。 これだけでは何なので試しにコードを書いてみました。あまりテストしていないのでバグがあっても悪しからず。 static int count(String str) { try { byte bytes[]=str.getBytes("MS932"); int n=0; for (int i=0; i<bytes.length; i++) { int x=(bytes[i] & 0xFF); if ((x>=0x81 && x<=0x9F) || (x>=0xE0 && x<=0xFC)) i++; // skip 2nd byte else if (x>=0xA1 && x<=0xDF) n++; } return bytes.length + n; } catch (java.io.UnsupportedEncodingException e) { return -1; } }

  • wormhole
  • ベストアンサー率28% (1619/5653)
回答No.1

>特殊な文字「まるの1、まるの2」等で試すと、特殊な文字のバイト数が1バイトとして >カウントされてしまいます。 EUC-JPだと対応するものがないので"?"に変換されてますから・・・ >特殊な文字「(1)、(2)」や半角カナ(2バイトとしてカウント)を含めて、 >簡単にバイト数をカウントすることはできないでしょうか。 やられたいカウントが特定の文字コードのバイト数というわけでもなさそうですので 自前でカウントするプログラムを組むしかないと思いますよ。

関連するQ&A

  • 半角カナから全角カナへ

    お世話になります。 今、フォームから入力された半角カナを全角カナへ変換しようとしているのですが、どうしてもうまく行きません。 処理は以下のようにしています。 jcode::convert(\$str, 'euc'); if($str =~ /[\xA1-\xDF]/){ jcode::h2z_euc(\$str); } (1)まず、半角カナが含まれているかのチェックで[\xA1-\xDF]を使用していますが色々調べたところ、実際は (?:\x8E[\xA6-\xDF]) が正しいようなのですが、この場合文字数が少ないとひっかかってくれません。例えば半角のア1文字や2文字など。また、文字数が多くても半角英数と半角カナが混在しているとひっかからない場合もあります。 上記の式だとひっかかってくれますが、この判定で構わないのでしょうか。 (2)上記の式できちんと置換されるものとされないで漢字のように文字化けするものと出てきてしまいます。 例えば「インターフェース」などという半角は全滅です。 「バージョン」などは大丈夫でした。 間違いなど教えて頂ければと思います。 宜しくお願い致します。

    • ベストアンサー
    • Perl
  • 全角、半角文字の判別について

    フォームのテキストで全角なら10文字まで、半角なら20文字まで入力できるようにしたいのですが、EUCの場合、半角カナは2バイトになるため、バイト数で制限をかけるとうまくいきません。かといって文字数で制限をかけてもうまくいきません。 何かいい方法はあるでしょうか?

    • ベストアンサー
    • PHP
  • 半角カナに悩まされております・・・。

    こんばんは! 度々質問させて頂いておりますイインンフォフォと申します。 さて早速質問に移ります。 DBより半角カナの抽出は出来たのですが更新をした場合に文字化けになります。 ピーナッツと言う半角カナのカテゴリがありそこにある情報を取得→更新と言う形です。 全角にしたらいいと言うご意見もあるかと思います。 全角にすると別なプログラムも狂ってしまうので半角でしかダメみたいです。 ピーナッツを抽出→表示 はOKです。 でも内容を更新すると→[ピーナッツ]が文字化けです。 フォームのプルダウンメニューから cate='$pr[4]' と言う形でインサート及び更新をしています。 抽出の時点では半角カナで表示されていて更新作業をすると化けてしまいます。 文字化けした場合、管理画面からカテゴリの訂正をしなければなりません。 DB→EUC-JP PHPファイル→SJIS となっております。 なぜでしょうか!! ご教授願います(*^-^*)

    • ベストアンサー
    • PHP
  • Java 波ダッシュ3バイトを2バイト認識したい

    入力文字列のバイト数チェックをするプログラムを修正していて、 以下の処理で波ダッシュが3バイトとして、認識されて困っています。 System.out.println("~".getBytes("MS932").length); >3バイト DBのテーブル格納時には、波ダッシュは2バイト扱いで登録する想定なので、 入力チェックで、3バイトでなく2バイトで波ダッシュのバイト数を認識したい次第です。 他の特殊文字は、きちんと2バイトで認識されています。 以下の正常に2バイトに認識されている文字は、影響をあたえずに、波ダッシュを2バイト と認識させる対応をお手数ですが、ご教授ください。 例.   "ア"   "試"   "ー"(全角ハイフン)   "まるの1" ※掲示板にかけないため、左記の表現(本当は2バイトの1文字)   "ミリ"   ※掲示板にかけないため、左記の表現(本当は2バイトの1文字) ※実行環境  ApacheのStruts環境  UnixとWindowsの両方の環境で実行。  デバックはWindows、テスト実施、本番稼働はUnix お手数をおかけしますが、よろしくお願い致します

  • eval 半角カナが文字化けする

    初めて投稿させていただきます。 半角カナが混ざっている文字列をevalすると、文字化けする場合があります。 どうすれば文字化けしないようになりますか? ちなみに全ての半角カナを全角カナに置換してevalを行いその後、半角カナに戻すということをやったのですが、もともと全角カナ文字まで半角カナに変換されてしまいました。できれば全角カナは全角カナ、半角カナは半角カナのまま文字化けせずにevalする方法を教えてください。

    • 締切済み
    • PHP
  • Jcode.pmでの半角カナ→全角カナ変換

    Webフォームから取得したデータに半角カナが含まれていた場合の文字化け対策として、Jcode.pmを使用して、下記のようにEUCに変換しています。 use Jcode; $euc_string = jcode($form_input)->h2z->euc; 原理的には間違ってはいない筈ですが、ほとんどの場合、$form_inputの文字コードの判別に失敗(恐らく半角カナをEUCと誤認)し、文字化けしてしまいます。誤認しないように、下記の様に記述すれば、正しく全角カナに変換してくれます。 use Jcode; $euc_string = jcode($form_input,"sjis")->h2z->euc; ただ、入力コードがシフトJISとは限りませんので、この記述は好ましくないと思っています。 半角カナの文字化けは、webフォームを作られた方なら皆さん経験されていると思うのですが、どうされているのでしょうか? Jcode.pmの文字コード判別は、半角カナが混じっていた場合、かなり長い文字列でないと判別に失敗するようなので、フォームで短い文字列(名前等)を入力させて処理させた場合、ほとんど上手く動かないようなのですが?

    • ベストアンサー
    • Perl
  • セル内の文字で半角2文字で1文字とカウントしたい

    openofficeを利用しています。 セル内の全角と半角が混じった文章から半角2文字で1文字とカウント 全角はそのまま1文字とカウント して文字数を数えることはできますでしょうか? LENBが利用できないので困っています。 よろしくお願いします。

  • 半角カナから全角カナに変換

    Jcode.pmを使用して半角カナから全角カナに変換したいのです。 こちらの過去ログを拝見し、以下のようなロジックを記述したのですが、 ”Undefined subroutine &Jcode::h2z_euc called at test_jcode.pl line 7.”というエラーが出てしまいます。 use Jcode; $line = 'アイウエオ'; $ato = &Jcode::h2z_euc(\$line); print $ato, "\n"; どなたかご回答よろしくお願いいたします。

    • ベストアンサー
    • Perl
  • 半角カナの使用について

    以前はメールやホームページで半角カナを使うと文字化けしたりしましたが、今は使われることが多くなっているように思えます。 実際のところどうなんでしょう。 自分に半角カナを入れたメールを送ると全角カナに変換されています。 ローカルディスクに半角カナをいれたHTMLファイルを作り、ブラウザで見るとそのまま半角カナで表示されます。 まだ使うと不具合が出たりするんでしょうか。 それとも使えるようになったんでしょうか。

  • 半角カナ文字と特殊文字の変換

    半角カナ文字と「丸で囲まれた1」や「はしご高」等の特殊文字を SJISからJISへ、JISからSJISへ変換する方法を調べています。 半角カナはJISにないという記述も見たのですが、 サクラエディタで双方へ変換できるのと、 Outlookへ半角カナで送信したところ文字化けせず(全角になっていましたが) 受信できたこと、「はしご高」は受送信で文字変換されているようなので、 何か方法があるのではないかと調べています。 方法や参考資料を教えていただければと思います。 よろしくお願いいたします。

専門家に質問してみよう