C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[4]: 文字コード変換について


(過去ログ 73 を表示中)

[トピック内 5 記事 (1 - 5 表示)]  << 0 >>

■43019 / inTopicNo.1)  文字コード変換について
  
□投稿者/ マツダ (1回)-(2009/10/27(Tue) 01:04:10)

分類:[Java] 

いつもお世話になります。
マツダといいます。

javaで以下のように実装を行いました。
char a = (char)0x8192 //£
BufferedWriter bw =
new BufferedWriter(
new OutputStreamWriter(
new FileOutputStream("hello.txt"),"MS932"));

bw.write(a);

しかしながら、実際にファイルのなかに書かれているのは"?"の文字となっていました。
これをきちんと0x8192で出力したい場合はどうすれば良いのでしょうか?
#色々と調べてみて、文字コード表に対応することができない文字は"?"で出すことが
#わかりましたが、解決策が浮かびません。

#なお、0x8192以外にも0x8191など文字コード表に対応することができない文字も、きちんと
#shift-jisのコードで表示したいと考えています。

以上、宜しければご教示願います。

引用返信 編集キー/
■43025 / inTopicNo.2)  Re[1]: 文字コード変換について
□投稿者/ 魔界の仮面弁士 (1364回)-(2009/10/27(Tue) 09:53:18)
# Java は専門外だったりしますが、わかる範囲で回答。
# もしかしたら、もっとスマートな書き方があるのかも知れない。

■No43019 (マツダ さん) に返信
> 文字コード表に対応することができない文字は
対応できませんか? £ の文字は、
    8192 : MS932
    A1F2 : EUC-JP
    2172 : ISO-2022-JP
    FFE1 : UTF-16
  EFBFA1 : UTF-8
というバイナリで表されるかと思いますが…。


で。java は文字列を Unicode として扱いますから、そもそも
> char a = (char)0x8192 //£
この変数 a が、£ を表していないという事かと。(セミコロンの有無はともかくとして)

今回扱うのが、(char)0x8192 の文字だとすれば、それは『{月}+{區}』な漢字を
意味するのだと思います。そして、この文字に割り当てられているコードは
    無し : MS932
    無し : EUC-JP
    無し : ISO-2022-JP
    8192 : UTF-16
  E88692 : UTF-8
ですから、MS932 で出力できないのも当然かと思います。


もしも、8192 というデータを Shift_JIS のテキストとして出力したいのであれば、
文字列として BufferedWriter.write(char) メソッドで出力しようとするのではなく、
その 8192 を(テキストではなく)バイナリファイルとして出力するために、
BufferedOutputStream.write(byte[]) などを使ってみては如何でしょう。

ByteArrayOutputStream baos = new ByteArrayOutputStream();
baos.write(Integer.parseInt("81", 16));
baos.write(Integer.parseInt("92", 16));
byte[] bin = baos.toByteArray();

BufferedOutputStream bos =
	new BufferedOutputStream(
	new FileOutputStream("hello.txt"));

bos.write(bin);
bos.close();

引用返信 編集キー/
■43028 / inTopicNo.3)  Re[2]: 文字コード変換について
□投稿者/ 魔界の仮面弁士 (1365回)-(2009/10/27(Tue) 11:35:42)
No43025 (魔界の仮面弁士) に追記
> ByteArrayOutputStream baos = new ByteArrayOutputStream();
> baos.write(Integer.parseInt("81", 16));
> baos.write(Integer.parseInt("92", 16));
> byte[] bin = baos.toByteArray();
> BufferedOutputStream bos =
> 	new BufferedOutputStream(
> 	new FileOutputStream("hello.txt"));
> bos.write(bin);
> bos.close();

今回は元データが
>> #なお、0x8192以外にも0x8191など文字コード表に対応することができない文字も
と固定的らしいので、下記で充分かも知れません。

BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("hello.txt"));
bos.write(new byte[] { (byte)0x81, (byte)0x91 });
bos.write(new byte[] { (byte)0x81, (byte)0x92 });
bos.write(new byte[] { (byte)0x81, (byte)0x93 });
bos.close();

引用返信 編集キー/
■43047 / inTopicNo.4)  Re[3]: 文字コード変換について
□投稿者/ マツダ (2回)-(2009/10/28(Wed) 00:33:09)

魔界の仮面弁士様、ご回答ありがとうございました。
本件については、無事理解することができました。
1点どうしてもわからない事があるので、別スレッドで投稿したいと思います。
以上、ありがとうございました。

No43028 (魔界の仮面弁士 さん) に返信
> ■No43025 (魔界の仮面弁士) に追記
>>ByteArrayOutputStream baos = new ByteArrayOutputStream();
>>baos.write(Integer.parseInt("81", 16));
>>baos.write(Integer.parseInt("92", 16));
>>byte[] bin = baos.toByteArray();
>>BufferedOutputStream bos =
>> new BufferedOutputStream(
>> new FileOutputStream("hello.txt"));
>>bos.write(bin);
>>bos.close();
>
> 今回は元データが
> >> #なお、0x8192以外にも0x8191など文字コード表に対応することができない文字も
> と固定的らしいので、下記で充分かも知れません。
>
> BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("hello.txt"));
> bos.write(new byte[] { (byte)0x81, (byte)0x91 });
> bos.write(new byte[] { (byte)0x81, (byte)0x92 });
> bos.write(new byte[] { (byte)0x81, (byte)0x93 });
> bos.close();
引用返信 編集キー/
■43048 / inTopicNo.5)  Re[4]: 文字コード変換について
□投稿者/ マツダ (3回)-(2009/10/28(Wed) 00:33:57)
No43047 (マツダ さん) に返信
>
> 魔界の仮面弁士様、ご回答ありがとうございました。
> 本件については、無事理解することができました。
> 1点どうしてもわからない事があるので、別スレッドで投稿したいと思います。
> 以上、ありがとうございました。
>
> ■No43028 (魔界の仮面弁士 さん) に返信
>>■No43025 (魔界の仮面弁士) に追記
> >>ByteArrayOutputStream baos = new ByteArrayOutputStream();
> >>baos.write(Integer.parseInt("81", 16));
> >>baos.write(Integer.parseInt("92", 16));
> >>byte[] bin = baos.toByteArray();
> >>BufferedOutputStream bos =
> >> new BufferedOutputStream(
> >> new FileOutputStream("hello.txt"));
> >>bos.write(bin);
> >>bos.close();
>>
>>今回は元データが
>>>> #なお、0x8192以外にも0x8191など文字コード表に対応することができない文字も
>>と固定的らしいので、下記で充分かも知れません。
>>
>>BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("hello.txt"));
>>bos.write(new byte[] { (byte)0x81, (byte)0x91 });
>>bos.write(new byte[] { (byte)0x81, (byte)0x92 });
>>bos.write(new byte[] { (byte)0x81, (byte)0x93 });
>>bos.close();
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -