- PR -

byte配列の文字コード置換

投稿者投稿内容
飴@玉
会議室デビュー日: 2006/09/12
投稿数: 4
投稿日時: 2007-06-20 21:56
引用:

元々やりたかった処理というのが、文字列のチェックなんです。
データベースから呼び出した文字列のコードがシフトJISなんですが、一部割り当てられてないコードが入っていることがありまして、それがあった場合に特定の文字に変換してやろうというのが目的でした。


既に入ってしまった未定義文字に対する対処も必要だと思いますが。
なぜ未定義文字が入ってしまうのかについての検討はされないのでしょうか?
対処した未定義文字のパターンが増えてしまうとか、なんだか心配ですよね。
データベースに入力しているシステムがどういう物か判りませんが
気になったので。
#データが更新されない仕組みならいらぬ心配ですが・・・
bonif
常連さん
会議室デビュー日: 2007/05/25
投稿数: 33
投稿日時: 2007-06-21 09:36
なんと言いますか・・・。
未定義文字は仕様で入ってしまうようです。
データをDBに格納せずに手作業で操作していたんですけど、それをプログラムで補おうとしたから未定義文字に気づいた・・・ということなんです。

多分修正されることは無いだろうし、更新されることもないでしょうけど・・・・
bonif
常連さん
会議室デビュー日: 2007/05/25
投稿数: 33
投稿日時: 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に変換しても文字化けは直らないわけですよね。

どうしたらいいんでしょうか
あしゅ
ぬし
会議室デビュー日: 2005/08/05
投稿数: 613
投稿日時: 2007-06-21 15:42
引用:

キューティーB☆O☆Nさんの書き込み (2007-06-21 15:01) より:
他の掲示板で言われたのですが、
Stringに入った瞬間にUnicodeに変換されていた場合、その文字列をbyteで読み出して未定義文字を修正したあとコードをSJISに変換しても文字化けは直らないわけですよね。


データベースやJDBCドライバが変換している場合は、
格納されている生のバイト列として取り出せない限り不可能です。

どんなデータベースを使っているか不明なのでわかりませんが、
ISO-8859-1等で取り出せるのならばそこからの変換も可能でしょう。
ですが、当然ながら不可能なデータベースもあります。

今までの経過から考えるとあきらめた方がいいのでは?
bonif
常連さん
会議室デビュー日: 2007/05/25
投稿数: 33
投稿日時: 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のエンコードについて書かれてありました。
コレと生のバイト列を取り出すということを踏まえて構築してみたいと思います。

nagise
ぬし
会議室デビュー日: 2006/05/19
投稿数: 1141
投稿日時: 2007-06-21 16:47
マルチポストの指摘はスルーするところではないですよ。
一度wikipediaの記事でも読んではいかがでしょうか。

コード:

@IT Javaの道
初期投稿 > B☆O☆N 06-20 13:11
06-20 14:06 ぼん < マルチポスト
06-20 14:38 淘汰された奴(3) < 投稿内容確認
投稿内容確認 > SUK2 06-20 14:44
投稿内容確認 > Edosson 06-20 14:45
投稿内容確認 > あすか 06-20 14:58
下記発言 > B☆O☆N 06-20 15:38
元々やりたかった処理というのが、文字列のチェックなんです。
データベースから呼び出した文字列のコードがシフトJISなんですが、
一部割り当てられてないコードが入っていることがありまして、
それがあった場合に特定の文字に変換してやろうというのが目的でした。
06-20 15:59 ぼん < 上記内容のコピー&ペースト
CharsetDecoder案 > あしゅ 06-20 17:41
byte配列で操作する場合のサンプルソースの提示
06-20 17:54 mio < 何に対して「割り当てられてないコード」か?
06-20 18:02 無名 < マルチポスト指摘
06-20 18:19 ぼん < 参考サイト提示 http://www.ne.jp/asahi/qpon/b/pc/sjis.htm
あしゅ氏案採用 > B☆O☆N 06-20 18:34
割り当てられてないコードは数パターンある情報
06-20 19:36 mio < DBからStringで読み込んではいけないという指摘
マルチポスト指摘 > ペンちゃん 06-20 21:08
混入対策の必要性指摘 > 飴@玉 06-20 21:56
仕様との回答 > B☆O☆N 06-21 09:36
06-21 09:40 ぼん < CVSから読み込んだ際にUnicodeに変換されるのか?
06-21 11:31 mio < Javaの時点で変換が発生する回答
06-21 11:42 ぼん < Stringの変換の際にエンコーディングことが分かったという回答
06-21 12:58 mio < 上記はbyte[]からの場合だという指摘
> B☆O☆N 06-21 15:01
未定義文字の先頭バイトが0x3Fだという情報、提示サンプルにバグがある報告、Javaの道側でのエンコーディングの指摘について言及
06-21 15:08 ぼん < 上記のコピー&ペースト
> あしゅ 06-21 15:42
JDBCドライバ次第では無理ではないか?
06-21 15:50 mio < DBから取得する時点でbtye[]でとる必要がある
06-21 16:20 ぼん < byte[]で取得して見るとの返答
> B☆O☆N 06-21 16:24
CVSへの言及、DBがAccessとの言及


敬称略にて失礼。
CVSへの言及など、時差が目立ちますね。
マルチポストでの会話の並列化が無駄なやり取りを生んでいるのがわかります。

# 効率的な情報交換についての考察のサンプルとしては興味深い

[ メッセージ編集済み 編集者: nagise 編集日時 2007-06-21 16:48 ]
スフレ
ぬし
会議室デビュー日: 2005/05/27
投稿数: 281
お住まい・勤務地: 東京
投稿日時: 2007-06-21 17:09
未定義文字って、ほんとうに未定義文字なんでしょうか?

元の Sample.csv を Windows のメモ帳で開いて化けてますか? 単に「Windows 依存文字で Shift_JIS にはない文字」だったりしませんか。その場合は「・」に変換するよりもいい解決方法があるかもしれませんよ。
bonif
常連さん
会議室デビュー日: 2007/05/25
投稿数: 33
投稿日時: 2007-06-21 17:20
>nagiseさん
意図的にスルーしてたわけではないのですが・・・・。
なんと言いますか、タイミングを計り損ねてしまったといいますか・・・。以後気をつけます。

>スフレさん
未定義でした。使われていない0x86○○が使われてました。聞いてみたところ、そのデータは外字らしく、それがちゃんと表示できていないんだそうです。
って、Windows依存文字なんでしょうか?
メモ帳とかで開いたら化けてないんですけど・・・・。
メモ帳、Excel、Wordで一度開いて保存すると、以後そのファイルを使っても文字化けとかが無くなるわけなんですが・・・・・。

スキルアップ/キャリアアップ(JOB@IT)