
テキストファイル(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で質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) PHPプログラムをエクセルに張り付けると検索ボックスがでてくる! 3 2022/05/08 07:10
- PHP htmlspecialcharsが機能していないです。 バグですか? 1 2022/04/05 01:22
- Excel(エクセル) Excelにて、フォルダ内のTextファイルをマクロで統合すると文字化けしてしまう時の解消コード 4 2023/01/01 07:32
- Visual Basic(VBA) セルの値からファイルを複数作りたい2 3 2022/10/07 15:54
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- JavaScript HTMLでJavaScriptを使ってパスワードの強化判定のプログラムを作成しています。 一通り作っ 2 2022/10/19 01:41
- Excel(エクセル) エクセルのVBAについて とあるサイトのコードを参考に、CSVの文字化けを直すVBAを作成しているの 7 2022/11/04 14:15
- PHP if(preg_match("/[^0-9]/",$gu_d)){意味を教えてください。 1 2022/05/06 05:37
- C言語・C++・C# C言語 3 2022/10/04 15:07
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ダブルクォーテーションのrepla...
-
TEXTAREAからのデータを改行入...
-
javaで質問です。 文字列2023/2...
-
int型のゼロ埋め
-
エクセルVBAで「〜」が表現でき...
-
4桁の数字を A*1000+B*100+C*1...
-
DBから取得したデータの文字化け
-
phpでの文字コード変換について
-
javaでのOracleのデータ登録の...
-
文字コード変換
-
カタカナをローマジに変換する。
-
文字列の比較
-
byte配列をImageに変換する
-
PerlプログラムをJavaに変換す...
-
なぜか + が半角スペースに変換...
-
javascriptで文字列のsjis利用...
-
VC++にてCString型のフルパスを...
-
Path型をString型へ変換する(Java)
-
javaの初歩的な質問です。
-
IE11においてのIME予測変換時の...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
javaで質問です。 文字列2023/2...
-
ダブルクォーテーションのrepla...
-
javascriptで文字列のsjis利用...
-
javaの初歩的な質問です。
-
Visual Basic でのコードをASCI...
-
JavaのStringクラスに「外字」...
-
Path型をString型へ変換する(Java)
-
エクセルVBAで「〜」が表現でき...
-
int型のゼロ埋め
-
JAVAでのShift-JISとEUC-JP間の...
-
C言語32bitから64bitの移行につ...
-
UTF-8とUnicodeの互換性
-
文字列の比較
-
COBOLで半角カナを全角カナに変換
-
substring バイト単位でやりたい
-
Windows-31Jからutf-8への変換...
-
カタカナをローマジに変換する。
-
[Javascript]エンターキー押下...
-
byte型のマイナスの扱いについて
-
文字化け対策について
おすすめ情報