アプリ版:「スタンプのみでお礼する」機能のリリースについて

Windows-31Jからutf-8への変換が分かりません><
java超ビギナーです。

SJISで書かれたCSVファイルのデータを、

CREATE TABLE `rep_test` (
`rep_name` varchar(48) NOT NULL,
`rep_name_kana` varchar(48) DEFAULT NULL,
`rep_id` varchar(16) DEFAULT NULL,
PRIMARY KEY (`rep_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8

こんな感じで作ったMySQLにINSERTする部分をJAVAで書いているんですが、
取り込んだ文字が化けます…

取り込む部分は、JPAとかいうのを使って書いていて、
以下のような感じです。
getBytes("Windows-31J"), "utf-8" 内の文字の組み合わせ
いろいろやってもダメでした…
どのようにすればいいのか、
ドナタか心優しい方、教えてくださいm(__)m

@TransactionAttribute(TransactionAttributeType.REQUIRED)
public int insertRows( CSVReader reader ) throws IOException {
EntityManager em = emf.createEntityManager();
String [] nextLine;

while ( ( nextLine = reader.readNext() ) != null ) {

RepTest rep = new RepTest();
rep.setRepId( new String( nextLine[0].getBytes("Windows-31J"), "utf-8" ) );
rep.setRepNameKana( new String( nextLine[1].getBytes("Windows-31J"), "utf-8" ) );
rep.setRepName( new String( nextLine[2].getBytes("Windows-31J"), "utf-8" ) );

// execute insert
em.persist( rep );
}

em.close();
return 0;
}

A 回答 (1件)

> new String( nextLine[0].getBytes("Windows-31J"), "utf-8" )



これは
- nextLine[0]というStringに入っている文字列をWindows-31Jのbyte配列に変換する
- そのbyte配列がUTF-8のデータだと見なしてStringに変換する
という意味になります。Windows-31JのデータをUTF-8のデータだと思って処理したら化けるのは当然です。

そうではなくて、
- CSVファイルから読み込んでStringにするときにWindows-31Jであることを指定する
- Stringの内容をデータベースに書き出すときにUTF-8であることを指定する
という手順を踏む必要があります。

ファイルから読むのにCSVReaderというのを使っているようですが、そのコンストラクタにjava.io.Readerのオブジェクトを指定しますよね。そのとき、"Windows-31J"を指定したjava.io.InputStreamReaderを渡すようにすれば読み込みの文字コード指定はできます。

JPAでデータベースを読み書きする場合の文字コード指定の方法は知らないので答えられません。
    • good
    • 0
この回答へのお礼

salsberryさん、レスどうもです!!

>Windows-31JのデータをUTF-8のデータだと思って処理したら化けるのは当然です。

この説明すごく分かりやすかったです。
で、次の、

>- CSVファイルから読み込んでStringにするときにWindows-31Jであることを指定する
>- Stringの内容をデータベースに書き出すときにUTF-8であることを指定する

が大変ヒントになりました^^v
えーと、このメソッド呼ぶ前に、

CSVReader reader = new CSVReader( new InputStreamReader( part.getInputStream(), "Windows-31J" ) );

こんな感じでやってたので、

RepTest rep = new RepTest();
rep.setRepId( nextLine[0] );
rep.setRepNameKana( nextLine[1] );
rep.setRepName( nextLine[2] );

まずは、こんな感じに、getBytes外しました。
で、DBに書く方は、
jdbc:mysql://localhost:3306/hogehoge?useUnicode=true&characterEncoding=UTF-8
ってPoolの設定したら出来ました~^^v
やった~!
大大感謝ですm(__)m

お礼日時:2010/09/02 23:28

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!