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;
}
No.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でデータベースを読み書きする場合の文字コード指定の方法は知らないので答えられません。
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
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- MySQL `picture` varchar(255) のコマンドで間違いないでしょうか? 1 2022/11/21 04:08
- MySQL エラー 1068 (42000): 複数の主キーが定義されていますエラー 2 2022/11/17 04:36
- PHP php テーブルが作成できない 1 2022/11/17 23:41
- MySQL php テーブルを作れない 2 2022/11/17 18:22
- MySQL あと、MySQLの文字コードはutf8 気になりますね 1 2022/12/01 07:22
- MySQL my_itemsテーブルのIDにAUTO_INCREMENT を追加ができるかで 1 2023/01/03 09:09
- Excel(エクセル) エクセルのVBAについて とあるサイトのコードを参考に、CSVの文字化けを直すVBAを作成しているの 7 2022/11/04 14:15
- AJAX JavascriptからPHPへのAjax通信でnullが返ってくる 3 2022/08/03 22:00
- MySQL テーブル作成です。どこかのスペルが間違っているか記号など スペースかな? 1 2022/10/01 05:08
- PHP php エラー 2 2022/10/23 16:43
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ダブルクォーテーションのrepla...
-
javaで質問です。 文字列2023/2...
-
Path型をString型へ変換する(Java)
-
カタカナの「ソ」以降の文字が...
-
文字列の比較
-
カタカナをローマジに変換する。
-
javaで「全角が含まれているか...
-
error C2440: 'static_cast' : ...
-
javaで入力したの半角カタカナ...
-
String <=> byte配列 の際のエ...
-
javascriptで文字列のsjis利用...
-
byte配列をImageに変換する
-
int型のゼロ埋め
-
Arduino(C言語) String "1101" ...
-
ASCII コード表の文字から10進に
-
エクセルVBAで「〜」が表現でき...
-
【JAVA】CharをByteに変換したい。
-
JAVA 文字コード変換
-
C言語32bitから64bitの移行につ...
-
カタカナ変換
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
javaで質問です。 文字列2023/2...
-
ダブルクォーテーションのrepla...
-
Path型をString型へ変換する(Java)
-
カタカナをローマジに変換する。
-
javascriptで文字列のsjis利用...
-
int型のゼロ埋め
-
Visual Basic でのコードをASCI...
-
文字列の比較
-
COBOLで半角カナを全角カナに変換
-
JavaのStringクラスに「外字」...
-
C言語32bitから64bitの移行につ...
-
byte[] を long,float とかに...
-
UTF-8とUnicodeの互換性
-
[Javascript]エンターキー押下...
-
エクセルVBAで「〜」が表現でき...
-
Windows-31Jからutf-8への変換...
-
substring バイト単位でやりたい
-
IBM漢字コード⇒SJIS変換方法
-
byte配列をImageに変換する
-
Arduino(C言語) String "1101" ...
おすすめ情報