• 締切済み

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 お手数をおかけしますが、よろしくお願い致します

  • sepro
  • お礼率47% (23/48)

みんなの回答

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

Windows7 + Java6 の環境では "\uff5e".getBytes("MS932").length は2になりましたけど。 それにMS932に3バイトのコードはなかったような・・・ 何にしてもいろいろ問題がありそうですが http://ja.wikipedia.org/wiki/%E6%B3%A2%E3%83%80%E3%83%83%E3%82%B7%E3%83%A5 http://www.informe.co.jp/useful/character/character14.html

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.1

http://ja.wikipedia.org/wiki/%E6%B3%A2%E3%83%80%E3%83%83%E3%82%B7%E3%83%A5#Unicode.E3.81.AB.E9.96.A2.E9.80.A3.E3.81.99.E3.82.8B.E5.95.8F.E9.A1.8C これの関係で、MS932に対応文字がない→UTF-8のまま(3バイト)、となってたりしないでしょうか?

関連するQ&A

  • 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バイトとしてカウント)を含めて、 簡単にバイト数をカウントすることはできないでしょうか。

  • 8桁文字列を16進数バイト配列に変換

    お世話になります。 VB2005を使用しています。 温調器から温度データを引っ張るプログラムを作成しています。 8桁の文字列を16進数バイト配列に変換したいのですが、GetBytesでは10進数バイト配列に変換されてしまいます。 8桁の文字列又は10進数バイト配列を16進数バイト配列に変換する方法はないでしょうか? 文字列を1文字ずつ16進数に変換して配列に組み込んでいくしかないのでしょうか? よろしくお願い致します。

  • 環境に依存しない文字長(日本語含む)の取得方法

    Stringデータ(日本語含む)の文字長を取得したいと考えています。 但し、日本語は2byte文字としてカウントしなくてはいけません。 で、今まで、 String.getBytes().length; で取得していたのですが、何かのタイミングで日本語を2byteとして扱えず、 「あいうA」を4byteと算出してしまうことがありました。 それで、getBytes()の引数にgetBytes("SJIS")と明示して取得することで、環境に依存しないbyte配列変換ができるのかなぁ、、と思っていますが、 この対応は間違っていないのでしょうか? また、これ以外の日本語byte数のカウント方法で「環境に依存しない」はあるのでしょうか? ご教授願います。

  • char型からのバイト数取得

    文字列から1文字ずつバイト数を取得(判定)したいのですが、 char型の文字のバイト数を取得するスマートな方法はありますか? 今考えているのは以下のようなコードです。 String str ="あA" for(int i=0; i < str.length(); i++) { char ch = str.charAt(i); StringBuffer SB = new StringBuffer(); SB.append(c); if(SB.toString().getBytes.length == 1) { //1バイトの処理 } else { //2バイトの処理 } }

    • ベストアンサー
    • Java
  • なぜ2バイトのファイルが扱えないのでしょうか?

    以前にも伺ったことですが、 なぜhttp(https)アクセスで2バイトのファイル名が扱えないのでしょうか? 私が調査したところ、 「WindowsとLinux(UNIXも含む)は文字コードが違うから」ということでした。 なので、テストとして自分のPC(WindowsXP Pro)にApacheとFTPソフトを入れ、 日本語のファイル名をUPLOADしhttpでアクセスしましたら、 きちんと認識(ブラウザで閲覧可能)できました。 しかし、世の中のWebサーバは(Linux)UNIXだけではなくWindowsで作られているものもあります。 ならば、なぜ2バイトのファイルが使えないのでしょうか?

  • 文字のバイト数を数えるには

    なんか一日一問になってしまったのですが、、 よろしくお願いします。 wchar_t 型に入っている文字のバイト数を数えるにはどうしたら良いでしょうか? L"あいう123" のような文字の場合UNICODEの場合12バイトですが、 全角半角区別して9バイトを求めたいです。 UNICODE環境では不可能でしょうか?

  • 整数を文字列として認識したい

    整数を文字列として認識したいんですが、可能なのでしょうか? 例えば、i=12470というint型の整数があるとして、1万の位の数1や、十の位の数7だけを取り出したいんです。 しかし、この際、1万の位の数1をi/10000、十の位の数7を(i%100)/10などというようにしては取り出したくないんです。 ややこしい質問ですが、よろしくお願いします。 というのも、整数を文字列として認識する目的は、int型として送られてきたデータが本当に整数なのかをチェックするためだからです。 初心者なので合っているか分かりませんが、整数を文字列として認識できれば、isdigit関数を使うことで、データが本当に整数なのかをチェックすることができるのかなあと考えているんですが・・・ もし、私の考えが間違っていたり、他に良い方法があったら是非教えて欲しいと思います。

  • oとかaとかにダッシュ文字の使い方

    すみません、初歩的な質問ですが、スペイン語やフランス語、ドイツ語にaやo等の上にダッシュや点点がある文字があるのですが、パソコンでUTF-8というコードだと表現できません。 向こうのネイティブの方は、rápidaをrapida(スペイン語)やGlücklicheをGluckliche(ドイツ語)と記載しても問題ないのでしょうか?(同じと認識されるのでしょうか?) ネイティブには失礼になるのでしょうか? フランス語、イタリア語、スペイン語、ドイツ語で記載したいのですが、良く分かりません。 ネイティブの感覚としては、間違っていると思われるのでしょうか?ご教諭願います。

  • 文字のバイト数について

    現在VBの勉強をしております(WindowsXP、VB6.0) テキストボックスの文字数(バイト)チェックを行っていて、不思議に思った事があるので質問させてください。 C言語では、数字の「1」は1バイトなのに、VBのLenBで取得すると、2バイトです。 これって何ででしょうか? 文字コードが違うからでしょうか? 以上、よろしくお願いいたします。

  • (1)を表示するには

    お世話になります。 ※タイトル、質問の中に(1)となってしまっていますが、マル1(マルのなかに1が入っている文字です) 以下要件を満たす関数を作りたいと思います ・文字列のINPUTに文字列をOUTPUTとする ・INPUTが60byte以上の場合は60byteに収まるようにしてOUTPUTする ・60byteできったときに最後の文字が2byte文字の場合はその文字は取り除いてOUTPUTする(この場合は60byteより短くなってもよい) 上記の問題を解決するために以下のようなメソッドを作りました。 public static String formatStatement(String realStatement) { if (realStatement == null || realStatement.getBytes().length < CUT_SIZE) { return realStatement; } byte[] b = realStatement.getBytes(); if ((int) b[CUT_SIZE - 1] < 0) { return new String(realStatement.getBytes(), 0, CUT_SIZE - 1); } return new String(realStatement.getBytes(), 0, CUT_SIZE); } この場合多くの文字は処理できるのですが、 (1)などの機種依存文字には対応できませんでした。 あとはどのような改良を加えればよいでしょうか? ※(1)などをSystem.out.printlnすると?になってしまいます。この対処方法も教えていただけるとありがたいです。 環境 WindowsXP Java1.4 開発環境はeclipse2.1

    • ベストアンサー
    • Java

専門家に質問してみよう