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")」などとしているのですが
同様の結果となります。
何か良い手はないものでしょうか?
No.8ベストアンサー
- 回答日時:
#4です。
> SJISのコードポイントを使って、文字列を作成しファイル出力をしたいのです。
Javaでは文字列(String)をすべてUnicodeで扱うので、
上記のようなことはできないと思います。
やるならバイトレベルでやるしかないような。。
なぜ、SJISの文字コードでStringを扱いたいのかが謎ですが。。
通常は
文字列は文字コードを意識しない
↓
ファイル出力時に文字コードを意識・(必要なら)変換して出力
だと思います。
そうでないなら、残念ながら私はお力になれません。。
No.7
- 回答日時:
#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)が「蝀」で出力
されてしまいます。
No.6
- 回答日時:
#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だとは思いますけど。
No.5
- 回答日時:
#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にしたいのです。
この処理を施してしまうと、文字化けが発生してしまうのです。
No.4
- 回答日時:
基本的には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の文字として扱うには
どの様にしたらよいでしょうか?
No.1
- 回答日時:
> SJIS:8744 - UNICODE:2464
これはつまり
UNICODEの文字2464をそのままSJISに変換すると
8744以外になるけど8744にしたいって言う意味かしら?
それともあなたの質問は
UNICODEで記述されている文字列をSJISに変換したい
ていう意味かしら?
それともどっちでもないのかしら?
この回答への補足
>UNICODEで記述されている文字列をSJISに変換したい
>ていう意味かしら?
はい。そのとおりです。
但し、特定の文字の文字コードだけを変換したいのです。
たとえば「「問題(1)」とあった場合は、
「(1)」の文字コード(コードポイント)をSJISのコードポイントにして
SJISファイルとしてファイル出力したいのです。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
天使と悪魔選手権
悪魔がこんなささやきをしていたら、天使のあなたはなんと言って止めますか?
-
フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
あなたが普段思っている「これまだ誰も言ってなかったけど共感されるだろうな」というあるあるを教えてください
-
映画のエンドロール観る派?観ない派?
映画が終わった後、すぐに席を立って帰る方もちらほら見かけます。皆さんはエンドロールの最後まで観ていきますか?
-
海外旅行から帰ってきたら、まず何を食べる?
帰国して1番食べたくなるもの、食べたくなるだろうなと思うもの、皆さんはありますか?
-
天使と悪魔選手権
悪魔がこんなささやきをしていたら、天使のあなたはなんと言って止めますか?
-
JavaのStringクラスに「外字」という概念はある?
Java
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Path型をString型へ変換する(Java)
-
javaで質問です。 文字列2023/2...
-
ダブルクォーテーションのrepla...
-
javascriptで文字列のsjis利用...
-
C言語32bitから64bitの移行につ...
-
なぜか + が半角スペースに変換...
-
文字列の比較
-
int型のゼロ埋め
-
cookie から取り出すと文字化け
-
replace()での文字列置換について
-
javaの初歩的な質問です。
-
文字について UNICODE
-
カタカナをローマジに変換する。
-
JAVAでSJISのコード変換
-
JavaのStringクラスに「外字」...
-
型変換キャストについて
-
COBOLで半角カナを全角カナに変換
-
Windows-31Jからutf-8への変換...
-
ファイルの書き出し方法について
-
Visual Basic でのコードをASCI...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
javaで質問です。 文字列2023/2...
-
ダブルクォーテーションのrepla...
-
Path型をString型へ変換する(Java)
-
int型のゼロ埋め
-
javascriptで文字列のsjis利用...
-
Visual Basic でのコードをASCI...
-
JavaのStringクラスに「外字」...
-
カタカナをローマジに変換する。
-
C言語32bitから64bitの移行につ...
-
UTF-8とUnicodeの互換性
-
COBOLで半角カナを全角カナに変換
-
文字列の比較
-
byte[] を long,float とかに...
-
全角英数字とハイフンを半角に...
-
byte型のマイナスの扱いについて
-
TEXTAREAからのデータを改行入...
-
javaの初歩的な質問です。
-
エクセルVBAで「〜」が表現でき...
-
DBから取得したデータの文字化け
-
[Javascript]エンターキー押下...
おすすめ情報