- ベストアンサー
JAVAでSJISのコード変換
- JAVAでUnicodeからSJISへのコード変換を行い、ファイル出力する方法について解説します。
- 文字列中にある特定の文字コードをSJISのコードに変換し、ファイルに出力する方法を紹介します。
- 文字列の各文字をUnicodeからSJISへのコード変換し、ファイルに出力する際に起こる文字化け問題について解説します。
- みんなの回答 (8)
- 専門家の回答
質問者が選んだベストアンサー
#4です。 > SJISのコードポイントを使って、文字列を作成しファイル出力をしたいのです。 Javaでは文字列(String)をすべてUnicodeで扱うので、 上記のようなことはできないと思います。 やるならバイトレベルでやるしかないような。。 なぜ、SJISの文字コードでStringを扱いたいのかが謎ですが。。 通常は 文字列は文字コードを意識しない ↓ ファイル出力時に文字コードを意識・(必要なら)変換して出力 だと思います。 そうでないなら、残念ながら私はお力になれません。。
その他の回答 (7)
- kei5989
- ベストアンサー率40% (11/27)
#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")と明示的に文字コードを指定してやる必要があったかと。
- kei5989
- ベストアンサー率40% (11/27)
#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だとは思いますけど。
- kei5989
- ベストアンサー率40% (11/27)
#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にしたいのです。 この処理を施してしまうと、文字化けが発生してしまうのです。
- kei5989
- ベストアンサー率40% (11/27)
基本的には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の文字として扱うには どの様にしたらよいでしょうか?
- SaKaKashi
- ベストアンサー率24% (755/3136)
特定の文字だけをSJISにして他はUNICODEでファイルに書き出すって事ですか? そんなコード系が混在したファイルをちゃんと取り扱えますか?
多分、10進数と16進数の区別が付いてないだと思います。
- askaaska
- ベストアンサー率35% (1455/4149)
> SJIS:8744 - UNICODE:2464 これはつまり UNICODEの文字2464をそのままSJISに変換すると 8744以外になるけど8744にしたいって言う意味かしら? それともあなたの質問は UNICODEで記述されている文字列をSJISに変換したい ていう意味かしら? それともどっちでもないのかしら?
補足
>UNICODEで記述されている文字列をSJISに変換したい >ていう意味かしら? はい。そのとおりです。 但し、特定の文字の文字コードだけを変換したいのです。 たとえば「「問題(1)」とあった場合は、 「(1)」の文字コード(コードポイント)をSJISのコードポイントにして SJISファイルとしてファイル出力したいのです。
補足
申し訳ありません。 私、若干の勘違いもありました。 SJISのコードポイントを使って、文字列を作成し ファイル出力をしたいのです。 つまり「SJIS:8744」からなるコードポイントから 文字を作成してファイル出力したいのです。 JavaではSJISのコードポイントからの文字をつくれないのでしょうか? String b = String.valueOf((char) 34624); の様にしてもUnicodeで扱われてしまうので、(1)(まる1)が「蝀」で出力 されてしまいます。