前提・実現したいこと
[前提]
趣味でプログラムを触ったことがある程度の初心者です。
今回、会社で初めてJavaを用いたPCソフトを作ることになりました。
質問内容はあまりに根本的な内容になるかとは思いますが、
参考本やHPに書かれている内容ではなかなか理解できず困っています。
是非、ご教授いただきたく思います。
[実現したいこと]
別のソフトからtxtファイル形式で出力されるデータを読み込み、
データベースに格納するといった処理を行いたいと思っています。
発生している課題・エラーメッセージ
[課題]
文字コードの変換方法がわかりません。
自己調査では.getByte()を使って行うのかなと思ったのですが、
格納後にチェックしてみると日本語が文字化けしてしまいます。
[その他情報]
・データベースやその他周辺のプログラムの文字コード指定は問題ないか
→txtファイルをUTF-8指定で保存、それをデータベースに格納すると問題なく表示されることから問題は今回のプログラムだと思っています。
そこで質問なのですが、
1.txtファイル(ANSI)をUTF-8で取得するにはどのような方法を用いれば良いのか。
(txtファイルは外部のプログラムからの出力なのでUTF-8指定で保存、は難しいと思っています。)
2..getbyte()を使う場合、https://www.sejuku.net/blog/19673 の内容を吟味しながら試してみたのですが、
byte[] bytes1 = str.getBytes("ANSI");
を行ってbyte型にしてから
String newStr1 = new String(bytes1, "UTF-8");
をすることでANSIの文字列がUTF-8に変換される、といった解釈で良いでしょうか。
よろしくお願いします。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

回答4件
0
ベストアンサー
1.txtファイル(ANSI)をUTF-8で取得するにはどのような方法を用いれば良いのか。
y_waiwaiさん回答のように外部(テキストファイル)からJavaの世界(UTF16/UTF32)へ正しく読み込むと考えます。
ANSIの読み込みですが、Charset.forName("MS932")を用いるとよいと思います。"Shift_JIS"
という文字セット名でも概ねうまくはいくのですが、それはMS932(Windows日本語版のMicrosoft独自Shift JIS)とは「厳密には違う文字セット」ですのでMS932を使うのが普通は無難と思います。メモ帳で見える文字と"Shift_JIS"
で読み込んだ結果が不一致になるといったことが有り得ますので。
Java
1void boo() throws IOException { 2 try (InputStream is = new FileInputStream("xx"); 3 InputStreamReader isr = new InputStreamReader(is, Charset.forName("MS932")); 4 BufferedReader br = new BufferedReader(isr)) { 5 String line; 6 while ((line = br.readLine()) != null) { 7 // Javaとしての正しい文字列になっているはず 8 } 9 } 10}
2..getbyte()を使う場合
多くの場合getBytesで「UTF-8のバイト列を自分で生成」する必要はありません。ファイルなりDBなりへ文字列を出力する機能に「しかるべき文字セットを指定する方法」があるからです。
今のプログラムでも「DBへ期待通りの文字が格納できている」ケースがあるならば問題点は外部ファイル(MS932)からJava内部へ読み込むことだけと思います。
投稿2018/03/05 04:10
総合スコア18404
0
まず、ANSIというコードセットは英数字記号だけ(俗に言う1バイト文字)の文字コードです
ですので、日本語がある、という時点で、それはANSIではないので、なんの文字コードか、というのを調べる必要があります
で、何らかの文字コードからUFT8に変換する方法ですが、
「Java UTF8 変換」でぐぐるといろいろ解説が出てきますので、みてみてください。
-- 追記 --
元文字コードがShift-JISということでしたので、「Java SJIS UTF8」でぐぐってみました
その中で参考になりそうなところは、
https://dev.classmethod.jp/server-side/java/csv_read_java_char_trans/
まさにSJISのファイルをUTF8にして読み込んでますね
んで、気をつけないといけないところは、Java の標準の文字コードはUTF16だ、ということです
まず、ファイルの読み込みをShiftJISとして読み込む(ということはプログラム内部でUTF16で保存される)
そして、データベースに保存するときには、(UTF16から)UTF8に変換しなければいけない、ということですね
投稿2018/03/05 00:52
編集2018/03/05 02:10総合スコア88163
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/03/05 05:00 編集
2018/03/05 04:10 編集
2018/03/05 04:16
2018/03/05 04:21
2018/03/05 04:59 編集
2018/03/05 05:22
2018/03/05 05:30

0
変換したいものがファイルである場合、javaのファイル入出力には文字コードを変換する機能がありますので、それを使います。
具体的にはnakazawaken1さんがコード記述されているので、ここでは省略します。
動作は次のようになります。
・ファイルから読むのと同時に、文字コード変換(シフトJis→javaの内部形式(UTF-16))して文字列として取得
・文字列(UTF-16)を文字コード変換(UTF-16→UTF-8)しながらファイルに書き出す
さて、質問者さんが調べた、
byte[] bytes1 = str.getBytes("ANSI");
String newStr1 = new String(bytes1, "UTF-8");
ですが、変換前後の文字列の使用をメモリ内だけで完結するようなケースで使います。
今回は、変換した文字列はファイルに書き出すだけなので、使用する必要はありません。
入出力処理の内部的に使っているので、あえて自分のプログラムでは使わなくてもいいと考えていいと思います。
それと、一応言っておくと、この2つの使い方が逆です。
byte[] bytes1 = str.getBytes("MS932");
文字列(内部コード)をMS932に変換したバイナリデータにする
String newStr1 = new String(bytes1, "UTF-8");
バイナリデータをUTF-8と判断して、文字列化(UTF-16)にする
という意味になりますので。
ちなみに、これらをどうしても使うなら、
1.テキストファイル(MS932)をバイナリデータとしてバイト配列(byte1)に読み込む
2.読み込んだbyte配列を、new String(bytes1, "MS932");で文字列化(str)する
3.文字列(str)をstr.getByte("UTF-8")でutf-8のバイト配列(byte2)に変換する
4.byte2をバイナリデータとしてファイルに出力する
となります。
「ファイルの入出力で行う」というのは、入力処理で1と2を、出力処理で3と4を同時に行っているということになります。
ちょっと、説明がグダグダになったような気もしますが、参考までに。
投稿2018/03/05 05:21
総合スコア289
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

0
コードのサンプルを書いてみました。(java8)
java
1import java.io.IOException; 2import java.io.PrintWriter; 3import java.nio.charset.Charset; 4import java.nio.charset.StandardCharsets; 5import java.nio.file.Files; 6import java.nio.file.Path; 7import java.nio.file.Paths; 8import java.util.stream.Stream; 9 10/** 11 * Shift_JISのファイルをUTF-8に変換 12 */ 13public class Q116094 { 14 /** 15 * @param args 変換前ファイル、変換後ファイル 16 */ 17 public static void main(String[] args) { 18 if (args.length < 2) { 19 System.err.println("変換前ファイル、変換後ファイルを指定して実行してください "); 20 System.exit(1); 21 } 22 Path from = Paths.get(args[0]); // 変換前ファイル 23 if (!Files.exists(from)) { 24 System.err.println("変換前ファイルが見つかりません: " + from.toAbsolutePath()); 25 System.exit(2); 26 } 27 Path to = Paths.get(args[1]); // 変換後ファイル 28 try (Stream<String> lines = Files.lines(from, Charset.forName("MS932")); // Shift_JISで読込 29 PrintWriter writer = new PrintWriter(Files.newBufferedWriter(to, StandardCharsets.UTF_8))) { // UTF-8で出力 30 lines.forEach(writer::println); 31 } catch (IOException e) { 32 e.printStackTrace(); 33 } 34 } 35} 36
投稿2018/03/05 03:56
総合スコア94
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/03/05 05:57