- - PR -
byte配列の文字コード置換
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 2007-06-20 21:56
既に入ってしまった未定義文字に対する対処も必要だと思いますが。 なぜ未定義文字が入ってしまうのかについての検討はされないのでしょうか? 対処した未定義文字のパターンが増えてしまうとか、なんだか心配ですよね。 データベースに入力しているシステムがどういう物か判りませんが 気になったので。 #データが更新されない仕組みならいらぬ心配ですが・・・ | ||||
|
投稿日時: 2007-06-21 09:36
なんと言いますか・・・。
未定義文字は仕様で入ってしまうようです。 データをDBに格納せずに手作業で操作していたんですけど、それをプログラムで補おうとしたから未定義文字に気づいた・・・ということなんです。 多分修正されることは無いだろうし、更新されることもないでしょうけど・・・・ | ||||
|
投稿日時: 2007-06-21 15:01
現状報告です。
皆さんに教えてもらったことをアレンジして作成をしています。 byte bt[]=str.getBytes(); for(int i=0;i<bt.length-1;i+=2){ if(bt[i]==0x3F){ bt[i]=(byte)0x81; bt[i+1]=(byte)0x45; } } try { return new String(bt,"Shift_JIS"); } catch (UnsupportedEncodingException e) { System.out.println(e.getMessage()); return str; } 未定義文字の先頭バイトが0x3Fだったので、それを検出したら次の要素2つ分を0x8145(・)に変換するという形にしてみました。 あしゅさんのコードのByteArrayOutputStreamでもやってみたのですが、それでならなかったので、直接byte配列に上書きするという形にしてみました。 一部の未定義文字の変換はできたわけですが、他の予想外のところでまた文字化けがあったり・・・・・ 予想外1:指定していないところが変換される 予想外2:2つ連続で未定義文字を検出すると、2番目を変換しない。 予想外3:3つ連続で未定義文字を検出すると、2番目だけ変換しない 他の掲示板で言われたのですが、 Stringに入った瞬間にUnicodeに変換されていた場合、その文字列をbyteで読み出して未定義文字を修正したあとコードをSJISに変換しても文字化けは直らないわけですよね。 どうしたらいいんでしょうか | ||||
|
投稿日時: 2007-06-21 15:42
データベースやJDBCドライバが変換している場合は、 格納されている生のバイト列として取り出せない限り不可能です。 どんなデータベースを使っているか不明なのでわかりませんが、 ISO-8859-1等で取り出せるのならばそこからの変換も可能でしょう。 ですが、当然ながら不可能なデータベースもあります。 今までの経過から考えるとあきらめた方がいいのでは? | ||||
|
投稿日時: 2007-06-21 16:24
データベースはAccessを使っています。
データはCSVからBufferedReaderで読み込んで、データに修正を加えた後にAccessデータベースに書き込んでいます。 //今現在の読み込み処理 FileInputStream fin=new FileInputStream("Sample.csv"); BufferedReader br=new BufferedReader(new InputStreamReader(fin,"Shift_JIS")); String line=br.readLine(); String data[]=line.split(","); InputStreamReaderはバイトストリームから文字ストリームに変換するという説明だったので、ここあたりから修正を加えていって生のバイト列を取得できるようにしようと思います。 あと、 http://hp.vector.co.jp/authors/VA017148/java/encoding.html 上記のページにStringのエンコードについて書かれてありました。 コレと生のバイト列を取り出すということを踏まえて構築してみたいと思います。 | ||||
|
投稿日時: 2007-06-21 16:47
マルチポストの指摘はスルーするところではないですよ。
一度wikipediaの記事でも読んではいかがでしょうか。
敬称略にて失礼。 CVSへの言及など、時差が目立ちますね。 マルチポストでの会話の並列化が無駄なやり取りを生んでいるのがわかります。 # 効率的な情報交換についての考察のサンプルとしては興味深い [ メッセージ編集済み 編集者: nagise 編集日時 2007-06-21 16:48 ] | ||||
|
投稿日時: 2007-06-21 17:09
未定義文字って、ほんとうに未定義文字なんでしょうか?
元の Sample.csv を Windows のメモ帳で開いて化けてますか? 単に「Windows 依存文字で Shift_JIS にはない文字」だったりしませんか。その場合は「・」に変換するよりもいい解決方法があるかもしれませんよ。 | ||||
|
投稿日時: 2007-06-21 17:20
>nagiseさん
意図的にスルーしてたわけではないのですが・・・・。 なんと言いますか、タイミングを計り損ねてしまったといいますか・・・。以後気をつけます。 >スフレさん 未定義でした。使われていない0x86○○が使われてました。聞いてみたところ、そのデータは外字らしく、それがちゃんと表示できていないんだそうです。 って、Windows依存文字なんでしょうか? メモ帳とかで開いたら化けてないんですけど・・・・。 メモ帳、Excel、Wordで一度開いて保存すると、以後そのファイルを使っても文字化けとかが無くなるわけなんですが・・・・・。 |