- PR -

[jdk1.3.1]全角文字を指定バイトで区切る方法

投稿者投稿内容
ひろ
会議室デビュー日: 2004/03/04
投稿数: 5
投稿日時: 2004-03-17 12:11
たびたびお世話になっております。
また、ご教授お願い致します。

今回、全角文字の入ったString型のデータをたとえば、1byte目から6byte目まで
取得したいときって、「String.getbytes」で一度byte型変換しないと
無理なのでしょうか??

ほかによい方法があればご教授お願い致します。
コード:

(例:文字列"あいうえお"から、"あいう"の6byteのみ切り出したい。
String inString ="あいうえお";
byte[] inbyte = inString.getbytes(inString);
byte[] otbyte = new otbyte[6];

for...{
、、inbyteからotbyteに6byteのみ移行
}
String otString = new String(otbyte);
... "あいう"が取得できる。



多少省いてますが、今まではこのような方法で行っていました。
ほかにスマートな方法があればご教授お願いします。
(補足。。文字列内は全角・半角混在の状態なので、substringは使用していません)


[ メッセージ編集済み 編集者: ひろ 編集日時 2004-03-17 12:14 ]
かずくん
ぬし
会議室デビュー日: 2003/01/08
投稿数: 759
お住まい・勤務地: 太陽系第三惑星
投稿日時: 2004-03-17 12:27
引用:

コード:
  for...{

     、、inbyteからotbyteに6byteのみ移行

  }




for文で回さず、arraycopyを使えば、少しはスマートになるのではないでしょうか。
coasm
大ベテラン
会議室デビュー日: 2001/11/26
投稿数: 237
投稿日時: 2004-03-17 13:11
わざわざコピーしなくても、
 String otString = new String(inbyte, 0, 6);
で良いのでは?
シュン
ぬし
会議室デビュー日: 2004/01/06
投稿数: 328
お住まい・勤務地: 東京都
投稿日時: 2004-03-17 14:08
JavaのStringは16bit Unicode(UCS-2)ですので、いわゆる半角文字も、1文字当たり
2byteです。サロゲート領域などを使用するような特殊な場合を除けば、正しく生成さ
れたStringオブジェクトから6byteを切り出すのとString#substring()で3文字切り
出すのは同じことのはずです。

もし、半角文字は1byteと扱って合計6byteを切り出したいということでしたら、その
場合は、一文字ずつ半角文字領域かどうかのチェックを個別に行う必要があると思い
ます。
ひろ
会議室デビュー日: 2004/03/04
投稿数: 5
投稿日時: 2004-03-17 14:27
みなさん早速の回答ありがとうございます。
coasmさんの方法で行おうと思います。
とても勉強になりました。
(できれば、、一行でやりたいというのが本音ですが、、)

>>シュンさんの書き込み
>>もし、半角文字は1byteと扱って合計6byteを切り出したいということでしたら、その
>>場合は、一文字ずつ半角文字領域かどうかのチェックを個別に行う必要があると思い
>>ます
はい。半角文字も1byteとして扱い、合計6byteを切り出したいという要求ですので、、
(説明不足でしたね。申し訳ありません)
補足::全角、半角文字混在のstringに対して、byteで区切ることは
仕様的に余りよろしくないのも承知ですが、現在仕方なくこの方法で行っています。

みなさんありがとうございました。
R-55
常連さん
会議室デビュー日: 2003/03/13
投稿数: 29
投稿日時: 2004-03-17 14:31
引用:

シュンさんの書き込み (2004-03-17 14:08) より:

もし、半角文字は1byteと扱って合計6byteを切り出したいということでしたら、その
場合は、一文字ずつ半角文字領域かどうかのチェックを個別に行う必要があると思い
ます。



String#getBytesはプラットフォームのデフォルト文字セットを使用するので
半角文字は1バイトになりませんか?
ゆうじゅん
ぬし
会議室デビュー日: 2004/01/16
投稿数: 347
投稿日時: 2004-03-17 14:53
半角が1Byteならcoasmさんの方法では全角文字が途中できれてしまう恐れがあります

コード:
例)「123456」を6Byte目で区切ると「4」の半分で区切られる



なのでシュンさんの書き込み通り
> 一文字ずつ半角文字領域かどうかのチェックを個別に行う必要があると思います
で実装するべきだと思います。
ひろ
会議室デビュー日: 2004/03/04
投稿数: 5
投稿日時: 2004-03-17 15:12
ゆうじゅんさん書き込みありがとうございます。
半角が1Byteならcoasmさんの方法では全角文字が途中できれてしまう恐れがあります

コード:
--------------------------------------------------------------------------------

例)「123456」を6Byte目で区切ると「4」の半分で区切られる


--------------------------------------------------------------------------------

はい。coasmさんの方法では、途中で切れるのも承知です。
ですので、
>>補足::全角、半角文字混在のstringに対して、byteで区切ることは
>>仕様的に余りよろしくないのも承知ですが、現在仕方なくこの方法で行っています。
と記述しました。
中途半端に切れた文字は、変に表現されますがそれはそれでOKだという判断のもとに
今回は作成しています。
説明足らずで申し訳ありません。

スキルアップ/キャリアアップ(JOB@IT)