- PR -

"〜"をgetBytes()した時の結果について

1
投稿者投稿内容
未記入
会議室デビュー日: 2008/03/28
投稿数: 1
投稿日時: 2008-03-28 18:59
一件、質問させて頂きます。
下記、処理をLinux環境、Windows環境でそれぞれ実行したところ、
getBytes()後の配列要素数がそれぞれLinux環境⇒1、Windows環境⇒2となってしまいました。(2となってほしかったのですが。。。)
【処理】
 String tmp = "〜";
byte tmpb[] = tmp.getBytes();
bytecounter = tmpb.length; ←この値が環境によって違う

"〜"以外の全角文字は問題なく2となります。なぜ"〜"だけが、、、
ご存知の方いらっしゃいましたら、ご教示願います。
ちなみにLinux環境⇒EUCコード、Windows環境⇒S-JISコードです。
JavaはUnicodeで処理するので関係ないと思いますが。。。
以上、宜しくお願いします。
だっちょ
大ベテラン
会議室デビュー日: 2006/12/05
投稿数: 115
投稿日時: 2008-03-28 20:02
 JavaのAPI仕様書にgetBytes()は"プラットフォームのデフォルトの文字セットを使用して" と書いてあります。
 ちなみに"〜".getBytes("EUC-JP")は3バイト,"〜".getBytes("SJIS")は1バイトです。
かつのり
ぬし
会議室デビュー日: 2004/03/18
投稿数: 2015
お住まい・勤務地: 札幌
投稿日時: 2008-03-28 20:07
getBytes()の戻り値は、現在のシステムの文字コードでデコードされます。
http://java.sun.com/j2se/1.5.0/ja/docs/ja/api/java/lang/String.html#getBytes()

違う環境下で同じ結果が欲しいのであれば、明示的に指定する必要があります。

引用:

JavaはUnicodeで処理するので関係ないと思いますが。。。


文字列(charの配列)自体はucs2というわれるコード体系になっていますが、
それをバイト列として扱う方法が文字コードによって違います。

簡単に言うと、
・文字のコード体系がucs2
・Javaでは1文字=nバイト
・nは文字コードにより不定
ということです。
スフレ
ぬし
会議室デビュー日: 2005/05/27
投稿数: 281
お住まい・勤務地: 東京
投稿日時: 2008-03-29 02:55
あれ? EUC-JP で1バイトになりますかね? 私の環境では以下のような結果になりました。

コード:
    public static void main(String[] args) throws Exception {
	String waveDash = "\u301c";
	String fullwidthTilde = "\uff5e";

	System.out.println("波ダッシュ Windows: "+waveDash.getBytes("ms932").length);
	System.out.println("波ダッシュ SJIS: "+waveDash.getBytes("shift_jis").length);
	System.out.println("波ダッシュ EUC: "+waveDash.getBytes("euc-jp").length);
	System.out.println("全角チルダ Windows: "+fullwidthTilde.getBytes("ms932").length);
	System.out.println("全角チルダ SJIS: "+fullwidthTilde.getBytes("shift_jis").length);
	System.out.println("全角チルダ EUC: "+fullwidthTilde.getBytes("euc-jp").length);
    }


コード:
波ダッシュ Windows: 1
波ダッシュ SJIS: 2
波ダッシュ EUC: 2
全角チルダ Windows: 2
全角チルダ SJIS: 1
全角チルダ EUC: 3



「〜」は確かに特別です。波ダッシュ#Unicodeに関する問題 を参照してください。

1

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