日記+趣味+アフィリエイト(+仕事)
 

スポンサーサイト

--/--/--(--) --:--:--
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。


※編集中です。

Javaでシステム開発やプログラムをする人にとっては
もしかしたら重要かもしれない話です。

■今回取り上げる問題
JavaのStringクラスのgetBytesメソッドとlengthプロパティを使って
全角文字のバイト数を取得すると
Windows環境とLinux環境では異なった結果になる。
Windows環境(文字セット:MS932):全角文字は2バイト
Linux環境(文字セット:UTF-8):全角文字は3バイト
例えば、

System.out.println( "全角文字列".getBytes().length );
//Windows環境(文字セット:MS932)で実行すると → 10
//Linux環境(文字セット:UTF-8)で実行すると → 15

となってしまいます。

□参考ページ
[うなの日記] 2008-05-13 [Java] String#getBytes()ではまる。
http://d.hatena.ne.jp/unageanu/20080513/1210686121

■対策方法
getBytesメソッドの引数に文字セット("EUC-JP"など)を指定する。
(他に良い方法をご存知の方は教えて下さい。)


■詳細(自分なりに調べて理解したつもりの詳しい説明?)
JavaのStringクラスに、文字列をバイト配列に変換するgetBytesというメソッドがあります。
全角文字にも対応した文字列のバイト数を取得する場合などに、
(配列の要素数を取得する)lengthプロパティと組み合わせて使われます。

例:(Windows環境の場合)
System.out.println( "abcdef".getBytes().length );
// → 6
System.out.println( "あいうabc".getBytes().length );
// → 9(全角は2バイト)

ただ、getBytesメソッドは引数に文字セット(文字コード)
("UTF-8"とか"Shift-JIS"とか)を指定することができます。

文字セットを指定しない場合[例:str.getBytes()]は、
プラットフォームのデフォルト文字セットを使用してこの String をバイトシーケンスに符号化し、
結果を新規バイト配列に格納します。
Windows環境では文字セット:MS932が、
Linux環境では文字セット:UTF-8が使用されます。

文字セットを指定しない場合[例:str.getBytes("Shift-JIS")]、
指定された文字セットを使用してこの String をバイトシーケンスに符号化し、
結果を新規バイト配列に格納します。
WindowsやLinux等の環境に関わらず指定された文字セットが用いられる。

詳細は「JavaTM API 仕様」をご覧下さい。
http://sdc.sun.co.jp/java/docs/j2se/1.4/ja/docs/ja/api/java/lang/String.html#getBytes()


getBytesメソッドの引数に文字セットを指定しないでコーディングした場合、
例えばユーザーから入力された文字列の長さのチェックを行う際に
Windwos環境とLinux環境とで異なる結果になってしまうという問題が起こります。

例:
String strInputValue = "テスト入力文字列";
// 全角10文字(20バイト)制限チェック
if( 20 >= strInputValue.getBytes().length ) {
return true;
} else {
return false;
}
//Windows環境(文字セット:MS932)で実行すると → true
//Linux環境(文字セット:UTF-8)で実行すると → false


ちなみに日本語の扱いに関して、
Linux環境では長い間 EUC が標準として扱われていて問題はなかったようですが、
(全角文字を2バイトとして扱うため)
2003年11月以降は標準文字セットがUTF-8に切替っているようです。
□参考資料 互換性重視の"EUC"か先進の"UTF-8"か
http://www.obenri.com/_minset_cent5/locale_cent5.html
http://www.obenri.com/_minset_wbel4/locale_wbel4.html

なので、例えば昔の@ITの記事でも、
getBytesメソッドの引数は空で使用しているので注意しないといけません。
□[@IT]作りながら理解する「JSPコーディング・テクニック」 第3回
http://www.atmarkit.co.jp/fjava/rensai/jsp2_03/jsp2_03_2.html


■感想
Javaは環境(や文字セット)によって動作が変わらないと思い込んでいると落とし穴にはまりそうです。
Javaでシステム開発をしている人達はどうしてるんだろう…?
今回たまたま文字セットを指定しないでgetBytesメソッドを呼び出しているコードを見つけたけど。
みんな知っていて、ちゃんと実装しているのかな?
そもそも、WindowsからLinuxへ移行したりその逆をするなんてことは
あんまりやらないのかな??
いずれにしても、気をつけておかないと…。

最後に、
長々とした文を最後まで読んでもらってありがとうございました…。(^^;


スポンサーサイト

8/3(日)の日記

2008/08/12(火) 00:11:13
この日はmixiで見つけたイングリッシュ・カラオケというコミュニティーの
OFF会に参加しました。
英語歌詞の曲のみをカラオケで歌うという企画です。

最近(半年くらい前?)洋楽を聴くようになって、
歌えるように練習しながら少しずつ持ち歌が増えてきてはいるのですが、
英語歌詞オンリーのカラオケは無謀ですョ…。
日々の練習の成果を出して(?)、僅かな持ち歌の中からなんとか5曲を歌いましたけど。
他の参加者の方は英語も本格的にやっているようで、やっぱり上手かったですね。(汗

まぁでも楽しかったので、また次回がればまた(無謀にも)参加するつもりです。(w

あと、次週の日曜日(8/10)には、1回500円で参加できる英会話の教室(?)に行くつもりです。
カラオケの後に聞いた話によると、今回のメンバー(僕以外)は
みんなその英会話の教室の後にカラオケをしているんだとか。

はぁ…(英会話に)ついていけるのかなぁ?やっぱり無謀かなぁ?(www


8/2の日記

2008/08/10(日) 17:31:09
8/2(土)、mixiで知り合った方と囲碁のネット対戦をしました。
何年かぶりに囲碁をやったのですが、
だいぶと弱くなっているようです。(--;
まぁ、でもやっぱり面白かったですけどね。

その後は、その囲碁で対戦した方と二人で飲むことに。
他にも何名かに誘いのメールはしたのですが集まらなかったので…(^^;
2,3時間くらい食べて飲んだ後、解散。
その帰りに、
TUTAYAでDVDのレンタルが半額だったことを思い出して寄っていくことに。
今回借りたのは↓

□音楽CD
Baroque Best(TWO-MIX)
7th anniversary BEST(TWO-MIX)
Favourite Worst Nightmare(Arctic Monkeys )
ウマウマできるトランスを作ってみた
イージーリスニング(坂本真綾)

□映画DVD
・スカイキャプテン
ワールド・オブ・トゥモロー プレミアム・エディション
ワールド・オブ・トゥモロー 初回限定スペシャル・プライス版

レビューはいずれ…、
と言いながら、忘れ去ってしまう可能性大ですが。(w


上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。