あなたの習慣について教えてください!!

JAVAで、UnicodeからSJISへのコード変換を行った上で
ファイル出力を行いたいです。

たとえば文字列中にある「(1)」の文字コードが以下である時
-------------------------------
SJIS:8744 - UNICODE:2464
-------------------------------
2464のコードを8744に変換した上でファイル出力したいです。


処理として、以下の様な形を考えているのですが
文字化けしてしまします。
-------------------------------
String source = "(1)あああああ";

文字列の数分ループ処理↓
int code = (int) (source[x].charAt(i));

if (code == 2464) {
strBuff.append(String.valueOf((char) (8744)));
}
-------------------------------

Unicodeで扱われているので「getByte("SJIS")」などとしているのですが
同様の結果となります。

何か良い手はないものでしょうか?

A 回答 (8件)

#4です。



> SJISのコードポイントを使って、文字列を作成しファイル出力をしたいのです。

Javaでは文字列(String)をすべてUnicodeで扱うので、
上記のようなことはできないと思います。
やるならバイトレベルでやるしかないような。。
なぜ、SJISの文字コードでStringを扱いたいのかが謎ですが。。

通常は
 文字列は文字コードを意識しない
  ↓
 ファイル出力時に文字コードを意識・(必要なら)変換して出力
だと思います。
そうでないなら、残念ながら私はお力になれません。。
    • good
    • 1

#4です。



> byte[] sjisb = source.getBytes("SJIS");
> byte[] unib = source.getBytes();
>
> として、unibで「2464」が出現した場合に、その位置にある
> sjisbのコードポイントを「8744」にすればよい訳ですかね。
> ↑すでに8744だとは思いますけど。

ご自分ではなにもしなくてOKですよ。
仰るように、sjisbではすでに「8744」です。
unibの「2464」が出現した位置に、sjisbでは「8744」があるって感じです。
文字コードの変換処理はString#getBytesがやってくれます。

機種依存文字についても、変換先の文字セットに対応コードがあれば、
上記でOKだと思います。
文字列に処理をするのは止めてやってみるとどうなりますか?
(「Unicodeの2464→SJISの8744」の自己処理は不要)

補足1:
SJISの8744も機種依存文字(丸5)であることには変わりないです。
「機種依存文字を出力したくない」なら、
コード変換ではなく文字自体を変えなければならないです。(ex.丸1→「(1)」)
この場合、自己処理は必要ですね。
ただし、SJISの8744ではなく、機種依存文字ではない文字(列)に変換してください。

補足2:
String#getBytes()は、
OSのデフォルトエンコードでバイト配列を取得だったと思うので、
unibもきっとSJIS(Windows31-J?)になります。
Unicodeのバイト配列を取得するには、
source.getBytes("Unicode")と明示的に文字コードを指定してやる必要があったかと。

この回答への補足

申し訳ありません。

私、若干の勘違いもありました。

SJISのコードポイントを使って、文字列を作成し
ファイル出力をしたいのです。

つまり「SJIS:8744」からなるコードポイントから
文字を作成してファイル出力したいのです。

JavaではSJISのコードポイントからの文字をつくれないのでしょうか?


String b = String.valueOf((char) 34624);
の様にしてもUnicodeで扱われてしまうので、(1)(まる1)が「蝀」で出力
されてしまいます。

補足日時:2010/12/26 11:03
    • good
    • 2

#4です。


もひとつ補足を。

文字列をそのまま、
byte[] b = source.getBytes("SJIS");
とすれば、bにはUnicode:2464がSJIS:8744に変換されて格納されてますよ。
そしてbをFileOutputStreamにwriteするのでもOKです。
(この場合、OutputStreamWriterは不要です)

ご参考まで。

この回答への補足

なるほど。

では、

byte[] sjisb = source.getBytes("SJIS");
byte[] unib = source.getBytes();

として、unibで「2464」が出現した場合に、その位置にある
sjisbのコードポイントを「8744」にすればよい訳ですかね。
↑すでに8744だとは思いますけど。

補足日時:2010/12/25 09:46
    • good
    • 0

#4です。


ファイルをSJISで出力するからといって、
javaのソース内でコードを意識する必要はないですよ。
それだと、すべての文字コードを把握しなければならなくなってしまいます(笑)。

すべてをSJISに変換ということであれば、
文字列は特に操作する必要ありません。
ファイルへの書き出し時に文字コードを指定してやります。
ファイルの書き出しはどうされてますか?
明示的に文字コードを指定する場合、
OutputStreamWriter out
= new OutputStreamWriter(new FileOutputStream( ファイル名 ), "SJIS")
として、outに対しStringのオブジェクトをwriteしてやればいいですよ。
# WindowsならFileWriterでもSJISかな。。
# (↑すみません、確認はしてないです)


あと、これは推測なのですが、
ひょっとして、「特定の文字を別の文字に変換したい」ということじゃないですか?
Unicodeの2464って、機種依存文字である丸囲み文字ですよね。
機種依存文字を出力したくないから、
例えば丸囲み文字の1を「(1)」に変換して出力したい、とか。。
勝手な推測なので、外していたらスミマセン・・・

この回答への補足

>ひょっとして、「特定の文字を別の文字に変換したい」ということじゃないですか?
>Unicodeの2464って、機種依存文字である丸囲み文字ですよね。
はい。

Unicodeの2464という文字(丸1)があった場合に、そのコード(コードポイント)を
SJISの8744にしたいのです。

当然、ファイル出力時には以下の様にするのですが
OutputStreamWriter out
= new OutputStreamWriter(new FileOutputStream( ファイル名 ), "SJIS")

上記処理前に、念の為、機種依存文字系の場合は処理上で、変換処理を施していたいのです。
#Unicodeの2464→SJISの8744にしたいのです。

この処理を施してしまうと、文字化けが発生してしまうのです。

補足日時:2010/12/25 02:59
    • good
    • 0

基本的にはNo.3の方と同意見なのですが。


最終的にSJISのファイルを作りたいんですよね?
特定の文字だけではなく、すべてSJISでよいのでは?
それとも特定の文字だけをファイルに出力したいんですか?
たとえば「問題(1)」とあった場合は、
「(1)」だけをファイルに出力したいとか?

とにかく、Javaでは文字列をすべてUnicodeで扱うので
SJISの文字コードのつもりでStringに変換しても意味はありません。
「String.valueOf((char) (8744))」は
8744で表されるUnicodeの文字を文字列にしようとしているだけです。

特定の文字だけをSJISに変換して、すべてをファイルに出力となると、
バイト配列で操作するしかないと思います。
無理やりですが、
 特定の文字 → getBytes("SJIS")
 それ以外の文字 → getBytes("Unicode")
でそれぞれバイト配列に変換して、繋ぐとかですかね?
それでFileOutputStreamにwriteすればファイルはできそうですが。。
ファイルは間違いなく化けますね。

テキストファイルの文字コードはひとつです。(SJISとUnicodeの混在とかはない)
もう一度、ご自分がやりたいことを整理してみてください。

この回答への補足

なるほど、すべての文字をSJISならSJISで扱えばよい訳ですね。

ただ、

文字列中にある「(1)」の文字コードが以下である時
-------------------------------
SJIS:8744 - UNICODE:2464
-------------------------------
2464のコードを8744に変換した上でファイル出力したい

という事は変わりません。

UNICODEの文字で「2464」が出現した時に、そのコードポイントをSJISの
8744としたいのです。

最終的にすべての文字がSJISになってしまっても問題ありません。

「String.valueOf((char) (8744))」をSJISの文字として扱うには
どの様にしたらよいでしょうか?

補足日時:2010/12/25 00:50
    • good
    • 0

特定の文字だけをSJISにして他はUNICODEでファイルに書き出すって事ですか?


そんなコード系が混在したファイルをちゃんと取り扱えますか?
    • good
    • 0

多分、10進数と16進数の区別が付いてないだと思います。

    • good
    • 0

> SJIS:8744 - UNICODE:2464


これはつまり
UNICODEの文字2464をそのままSJISに変換すると
8744以外になるけど8744にしたいって言う意味かしら?

それともあなたの質問は
UNICODEで記述されている文字列をSJISに変換したい
ていう意味かしら?

それともどっちでもないのかしら?

この回答への補足

>UNICODEで記述されている文字列をSJISに変換したい
>ていう意味かしら?
はい。そのとおりです。

但し、特定の文字の文字コードだけを変換したいのです。

たとえば「「問題(1)」とあった場合は、
「(1)」の文字コード(コードポイント)をSJISのコードポイントにして

SJISファイルとしてファイル出力したいのです。

補足日時:2010/12/24 18:35
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています