47695

[code]

    import java.io.BufferedWriter;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.OutputStreamWriter;
    import java.io.PrintWriter;
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.sql.Statement;
    public class ConnectTest {
    
    public static void main(String args[]) throws Exception {
        // TODO 自動生成されたメソッド・スタブ
        /*
         * 接続先のサーバー名を"localhost"で与えることを示してる
         */
        // String severname = "localhost";
    
        /*
         * 接続するデータベース名をMySQLとしてる
         */
        String databasename = "companydata";
    
        String username = "root";
    
        String password = "root";
    
        /*
         * デフォルトencodeをUTF-8に指定
         */
    
        //String severencoding = "UTF-8";
    
        /*
         * データベースのURLを指定
         */
        String url = "jdbc:mysql://localhost:3306/" + databasename;
    
        /*
         * オブジェクトConnectionを初期化
         */
        Connection con = null;
    
        try {
            Class.forName("com.mysql.jdbc.Driver").newInstance();
    
            /*
             * DriverManagerクラスのgetConnectionを使ってデータベースにアクセス
             */
            con = DriverManager.getConnection(url, username, password);
    
            System.out.println("Connected......");
    
            Statement st = con.createStatement();
    
            String sqlStr = "SELECT * FROM empinfo;";
    
            ResultSet result = st.executeQuery(sqlStr);
    
            while (result.next()) {
                String str1 = result.getString("empCd");
                String str2 = result.getString("name");
                String str3 = result.getString("birthday");
                String str4 = result.getString("countryCd");
                String str5 = result.getString("sexCd");
                String all = str1 + "," + str2 + "," + str3 + "," + str4 + "," + str5;
                System.out.println(all);
    
                try {
                    //FileWriter fw = new FileWriter("C:\\Users\\liu\\Desktop\\test.csv", true);
                    PrintWriter pw = new PrintWriter(new BufferedWriter(new OutputStreamWriter(new FileOutputStream("C:\\Users\\liu\\Desktop\\test.csv", true),"utf-8")));
    　　　　　　　　　pw.write(0xef);　//　こちらにBOMをつけた
                    pw.println(all);
                    pw.close();
                } catch (IOException e) {
                    // TODO: handle exception
                    System.out.println(e.getMessage());
                }
            }
            System.out.println("出力完了！");
    
            result.close();
    
            st.close();
    
            con.close();
    
        } catch (SQLException e) {
            // TODO: handle exception
            System.out.println("Connection Failed : " + e.toString());
    
            throw new Exception();
        } catch (ClassNotFoundException e) {
            // TODO: handle exception
            System.out.println("ドライバーを読み込めませんでした " + e);
        }
        finally{
            try {
                if (con != null) {
                    con.close();
                }
            } catch (Exception e) {
                // TODO: handle exception
                System.out.println("Exception2! : " + e.toString());
            }
        }
    }
    
[/code]

}

JAVAの初心者ですが、今はMySQLのデータを検索して、  
そして結果をCSVファイルに出力したいです。  
以下の状態になってしまいました。  
UTF-8を指定したはずですが、  
効いてないようです。

追記：先ほどちょっと試しにcsvじゃなく、txtファイルに出力してみました。txtファイルなら問題ない模様です。

[![文字化けだけでなくて、形も崩れたようです。](https://i.stack.imgur.com/2hPTn.png)](https://i.stack.imgur.com/2hPTn.png)

文字化けだけでなくて、出力の書式も崩れたようです。

追記２：  
vscodeで開いてみましたが、  
冒頭の部分に変な文字列が入っているようです。  
**PS:こちらはBOMを付けた結果です。自分の勘違いです。**  
[![vscodeで開いた後](https://i.stack.imgur.com/bbmfh.png)](https://i.stack.imgur.com/bbmfh.png)

追記３：  
コンソールでは問題なし

[![コンソールのスクショ](https://i.stack.imgur.com/pwuSc.png)](https://i.stack.imgur.com/pwuSc.png)

どこが間違ているのですか。  
ご指摘のほど宜しくお願い致します。


CC BY-SA 4.0
2018-08-21T06:57:33.457
47693
2018-08-21T08:53:10.663
2018-08-21T08:53:10.663
13007
13007
question
java mysql csv
javaのCSVファイルを出力する時について質問です


以下のURLによると  
<https://stackoverflow.com/questions/3275524/java-mysql-utf8-problem>

[code]

    String url = "jdbc:mysql://localhost:3306/" + databasename;
    
[/code]

の個所を

[code]

    String url = "jdbc:mysql://localhost:3306/" + databasename + "?useUnicode=true&characterEncoding=utf-8";
    
[/code]

とすればいいようなことを書いていますが、いかがですか？

■追記  
テキストファイル上での表示を元にどう化けているのかを調べた結果、  
UTF8で出力したデータをShift-JISで表現すると同じ結果となりました。

原因はMicrosoftExcelでUTF8で出力されたデータを表示しようとしたからに思えます。  
MicrosoftExcelは基本的にShift-Jisで表現しようとするので、このような現象になります。  
CSVファイルをダブルクリックで開かずエクセル内にインポートするか、CSVにBOMコードと呼ばれるコードを付加してみてください。


CC BY-SA 4.0
2018-08-21T08:02:29.967
47695
2018-08-21T08:45:14.290
2018-08-21T08:45:14.290
17014
17014
47693
answer