2018年5月26日土曜日

Javaでバイト数カウントする時に、Shift_JISに変換するやつを単純に使ってはいけない!!

いやーちょっとJavaでハマりました。

文字列のバイト数をカウントしたい時どうやるの?という話なんです。

つまり、全角文字は2バイト、半角文字を1バイトとしてカウントしたい時ですね。

具体的には("文字列".getBytes("Shift_JIS")).lengthとやればいいのだ!!と思ったら、結論から言うとこれはダメだった!!

「いったん、文字コードをShift_JISに変換してから、そのバイト数をカウントする」という手法ですね。

少なくともWindows OS上で実行すると、「~」、「㈱」や「-(全角ハイフン)」は、2バイトではなくて1バイトで結果が返ってきます(涙)

C#言語では大丈夫だったので、油断してしまいました。

これはどういう事かというと、Javaは、Unicodeにあって、Shift_JISに無い文字は、1バイト文字の「?」に強制的に変換してしまい、それを1バイトとしてカウントしてるみたいなんです。

結局、文字列を一文字づつ見て行って、UTF-8でバイト数をカウント。

1バイト文字は1バイトとしてカウントし、1バイトを超えたら強制的に2バイトとしてカウントする・・・というコードでやってみました。

これもどうなんだと思うんですが、今のところ思った通りの制御が出来ています。