
テキストファイル(ASCII)をUTF-16LEに文字コード変換するプログラムを作成したいのですが、
期待通りの結果がえられません。
下記のプログラムに問題があればご教授下さい。
(文字数の関係でコメント文を省略しました。)
--------------------
StringsInputFile=args[0];
StringsOutputFile=args[1];
CharsetutfCharset=Charset.forName("UTF-16LE");
CharsetEncoderencoder=utfCharset.newEncoder();
ByteBufferutfBytes=null;
try{
FileInputStreaminput=newFileInputStream(sInput);
FileOutputStreamoutput=newFileOutputStream(sOutput);
bytebuf[]=newbyte[256];
intlen;
while((len=input.read(buf))!=-1){
ByteBufferunicodeBytes=ByteBuffer.wrap(buf);
try{
utfBytes=encoder.encode(unicodeBytes.asCharBuffer());
}
catch(CharacterCodingExceptione){
System.out.println("EncodeError!!["+e.getMessage()+"]");
continue;
}
output.write(utfBytes.array(),0,len);
}
output.flush();
output.close();
input.close();
}catch(FileNotFoundExceptione){
}catch(IOExceptione){
}
return;
}
--------------------
入力ファイルの中身は[TEST]と入力されています。
上記プログラムで得られた結果(出力ファイル)
をバイナリエディタで確認すると
期待結果は
[5400450053005400]
なのですが、
[45545453](テキスト表示すると[ETTS])
となってしまいます。
できれば、BOM(FFFE)も先頭に付加したいです。
以上、宜しくお願い致します。
A 回答 (3件)
- 最新から表示
- 回答順に表示
No.3
- 回答日時:
> unicodeBytes.asCharBuffer()
ByteBuffer を CharBuffer に変換したいんでしょうが、これではうまくいきません。
これは 2n バイトの ByteBuffer を 2 バイトずつ区切って n 文字の CharBuffer に変換せよという意味になります。
そもそも元のファイルから読み取ったデータをそのままむりやり文字に変換しようとしているのが誤りです。
元のファイルは ASCII でエンコーディングされているのですから、まずデータを ASCII バイト列から文字列に変換 (デコード) した上でそれを UTF-16 バイト列に変換 (エンコード) しなくてはなりません。
デコードの仕方はエンコードの仕方と似ているので調べればすぐ分かるでしょう。
No.2
- 回答日時:
#1です
補足しときますと、元々のソースのほうは変換元がASCII
であるために失敗しているんだと思います。
CharsetEncoderのAPIには
"16 ビット Unicode 文字のシーケンスを特定の文字
セットで表現されたバイトシーケンスに変換する
エンジンです。"
とありますので、ASCII文字列をUnicode(Big Endian)
だと思って変換しちゃうんでしょうね。
No.1
- 回答日時:
OutputStreamWriterでエンコード指定しちゃうのが楽そうです。
(いずれにしても BOMは直接書かないとだめそうですが)
簡単には以下のようになりますか・・・
FileOutputStream fos = new FileOutputStream("./test.txt");
byte[] BOM={(byte)0xFF,(byte)0xFE};
fos.write(BOM);
OutputStreamWriter osw = new OutputStreamWriter(fos, "UTF-16LE");
osw.write("TEST");
osw.close();
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
javascriptで文字列のsjis利用...
-
Path型をString型へ変換する(Java)
-
javaで質問です。 文字列2023/2...
-
C言語32bitから64bitの移行につ...
-
javaの初歩的な質問です。
-
ダブルクォーテーションのrepla...
-
JavaのStringクラスに「外字」...
-
半角カタカナをローマ字変換す...
-
文字化け対策について
-
error C2440: 'static_cast' : ...
-
jspでString型からlong型への変換
-
スマホでテキストボックスの随...
-
オブジェクトの中のプロパティ...
-
JSPでDBからデータ読み込みブラ...
-
ループ処理の際、最後だけ","を...
-
ORA-01858: 数値を指定する箇所...
-
system.out.printが出力されない
-
行の途中から読み込む方法
-
IF関数でEmpty値を設定する方法。
-
System.err. printlnとSystem.o...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
javaで質問です。 文字列2023/2...
-
ダブルクォーテーションのrepla...
-
javascriptで文字列のsjis利用...
-
int型のゼロ埋め
-
javaの初歩的な質問です。
-
Path型をString型へ変換する(Java)
-
C言語32bitから64bitの移行につ...
-
JavaのStringクラスに「外字」...
-
エクセルVBAで「〜」が表現でき...
-
カタカナの「ソ」以降の文字が...
-
Windows-31Jからutf-8への変換...
-
pasteHTMLでパスが勝手に変換さ...
-
DBから取得したデータの文字化け
-
数字のみにしたい
-
Visual Basic でのコードをASCI...
-
ジェネリックのキャストをした...
-
補数について質問
-
publicがprotectedになった場合...
-
error C2440: 'static_cast' : ...
-
文字を整数(int)に変換
おすすめ情報