
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で質問しましょう!
似たような質問が見つかりました
- Java Javaの問題なのですが、「3文字以上の英数字文字列を入力し、文字列の中に文字(9)が出てくるまでの 1 2023/06/06 18:55
- Visual Basic(VBA) 入力ボックスが繰り返しポップアップして止まらない。 下記コードでファイル名の変更をしたいのですが、変 1 2022/09/08 11:27
- Visual Basic(VBA) ファイル名の右側を変更したい ファイル名:「1001日別売上」の左側へ「2022」を追加し、「202 6 2022/10/14 10:03
- Excel(エクセル) エクセルのVBAについて とあるサイトのコードを参考に、CSVの文字化けを直すVBAを作成しているの 7 2022/11/04 14:15
- Excel(エクセル) Excelにて、フォルダ内のTextファイルをマクロで統合すると文字化けしてしまう時の解消コード 4 2023/01/01 07:32
- Visual Basic(VBA) サブフォルダ(データ)にある複数の.xlsxファイルのSheet3のA2セルの値で01から左側をB2 2 2022/08/14 15:46
- Visual Basic(VBA) 集めたシートのシート名を変更したい。 下記のコードでサブフォルダにあるファイルのSheet3を集めて 6 2022/08/23 10:38
- PHP PostgreSQLからCSV形式でエクスポートする際にカラム内の改行をとる方法 1 2023/02/22 10:05
- C言語・C++・C# 宣言する関数の形が決まっている状態で、 str1とstr2の文字列をこの順に引っ付けてstrに保存し 2 2022/05/30 18:21
- Excel(エクセル) 【VBA】指定フォルダに格納中のテキストファイルをエクセルで処理し結果のエクセルを新規フォルダに保存 1 2022/03/25 14:19
関連するカテゴリから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型のマイナスの扱いについて
-
文字化け対策について
おすすめ情報