🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

3回答

5619閲覧

Javaで20バイト分文字を取得して足りない部分は右側にスペースを挿入させて、SJIS文字 として扱うには

kumakumatan

総合スコア213

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2019/12/25 05:17

Javaバージョン:8
OS:Windows

java

1String ABC = "アイウエオ"; 2 3String TEST = String.format("%-20s",ABC); 4String TEST2 = new String(TEST.getBytes("SJIS"), 0, 20, "SJIS"); 5 6txtbw.write(TEST2);

のようなソースがあり、ABCの値「アイウエオ」に20文字より足りない場合、スペースを
つけて、20バイト分の値をテキストに書き込む処理をしようとしています。

String TEST = String.format("%-20s",ABC);
を外して、
String TEST2 = new String(ABC.getBytes("SJIS"), 0, 20, "SJIS");
とすると、ABCの値が5文字(20バイト未満)なので、エラーになってしまいます。
そこで、
String TEST = String.format("%-20s",ABC);
として、空白文字を右側に埋め込んだ後に、
String TEST2 = new String(TEST.getBytes("SJIS"), 0, 20, "SJIS");
としたのですが、作成されたテキストの文字コードが[EUC]となり、「アイウエオ」が文字化けに
なってしまいます。

String.format("%-20s",ABC)の部分がEUCにしていると思うのですが、ここをSJISにして、
文字化けをさせない方法はありますでしょうか?

String TEST2 = new String(TEST.getBytes("SJIS"), 0, 20, "SJIS");
の部分にて「TEST」文字が20バイト未満であれば、半角スペースを埋め込み、
20バイトをSJISで取得するような方法があればご教授をお願いします。

宜しくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

maisumakun

2019/12/25 05:19

「作成されたテキストの文字コードが[EUC]となり、」というのはどのような方法で確認しましたか?
kumakumatan

2019/12/25 05:22

noeditorなどのテキストエディタで開いた際、右下に文字コードが表示されるので確認しました。 宜しくお願いします。
dodox86

2019/12/25 06:27

EUCですと半角カタカナ「アイウエオ」は無かったと思うので、maisumakunさんのご指摘どおり、エディターの文字コード解釈の問題だと思います。 バイナリエディタで確認したときに16進数ダンプでB1 B2 B3 B4 B5 20 20 20 ...(15バイトの20h)となっていれば、シフトJISで出力されています。
dodox86

2019/12/25 06:37

すみません、間違えました。訂正します。 誤:EUCですと半角カタカナ「アイウエオ」は無かったと思うので、 正:半角カタカナ「アイウエオ」、日本語EUCだと以下のシーケンスです。 8e b1 8e b2 8e b3 8e b4 8e b5
guest

回答3

0

ベストアンサー

noeditorなどのテキストエディタで開いた際、右下に文字コードが表示されるので確認しました。

おそらく、エディタの誤判定です。「B1 B2 B3 B4」というバイト列をSJISで解釈すると「アイウエ」ですが、EUCで解釈すると「渦慨」となり、どちらも正しく文字になっているので、どちらが正しいのか決まりません

投稿2019/12/25 05:26

maisumakun

総合スコア145963

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

maisumakun

2019/12/25 05:28

ファイルの内容やコメントに文字コードが指定されているものを除けば、エディタの判定はあくまで「推測」でしかありません。誤判定することもあります。
kumakumatan

2019/12/26 00:44

ありがとうございます。バイナリエディタなどで文字コードを確認したところ「SJIS」コードの文字が入っていました。なのでエディタの誤判定だと思われます。
guest

0

Unicode -> SJIS
Stringはunicodeです。これをShift-JISにするには、StringのgetBytes()を使います。

Java

1byte[] sjis = ABC.getBytes("SJIS");

Shift-JISには、半角文字(1バイト)、全角文字(2バイト)があり、いったんbyte[]にしてみないと正確な長さがわかりません。sjisが20バイトに満たなければ後ろに0x20を追加すればよい。20バイトを超える場合、20バイトで切ると、末尾の全角文字が切られるかもしれず、困ったことになります。

後ろにShift-JISの半角スペース(0x20)を入れる。

Java

1byte[] result = new byte[20]; 2for (int i=0,l=sjis.length; i<20; ++i) { 3 result[i] = (i<l) ? sjis[i] : (byte) 0x20; 4}

sjisが20バイトを超える場合は使えません。全角文字を全く扱わない場合は切り捨て問題は起こりません。

バイト配列をファイル出力(追記)

もしかして、バイナリファイルの出力方法がわからないということでしょうか。byte[]をそのままファイル出力するには、java.io.FileOutputStreamを使います。

Java

1try (FileOutputStream fs = new FileOutputStream(" ... ")) { 2 fs.write(sjis); 3} catch (IOException e) { ... }

java.io.OutputStreamWriterで出力するとunicode -> ネイティブエンコーディング変換が行われます。
Reader/Writerはエンコーディングを変換します。InputStream/OutputStreamはバイナリをそのまま扱い変換しません。

投稿2019/12/25 07:06

編集2019/12/25 14:40
xebme

総合スコア1090

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

その文字列の後ろに20文字の半角スペースをくっつけて、20バイトgetByteすればいいんでは

投稿2019/12/25 05:20

y_waiwai

総合スコア88038

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kumakumatan

2019/12/25 05:23

ご回答ありがとうございます。 実際、どのようにすればいいでしょうか? 宜しくお願いします。
y_waiwai

2019/12/25 05:27 編集

(TEST+" ").getBytes("SJIS") で先頭から20バイト取得する
y_waiwai

2019/12/25 05:28

スペースの連続は省略されるのね。。 (TEST+スペース20文字)ね。
y_waiwai

2019/12/25 05:30

ああ、文字列にするだけなら、SJISにしてそっから20文字切だせばいいだけやん
kumakumatan

2019/12/25 05:37

ご回答ありがとうございます。 >スペース20文字 どのようにしたら挿入できますでしょうか? >SJISにして どのように変換できますでしょうか? 宜しくお願いします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問