- PR -

struts ファイルアップロードの文字エンコーディングについて

投稿者投稿内容
raystar
ぬし
会議室デビュー日: 2003/01/16
投稿数: 251
お住まい・勤務地: Tokyo/Japan
投稿日時: 2004-08-31 14:27
こんにちは。

struts を使用し、 textファイルをアップロードするモジュールを作っています。
内容としましては、
CSVのテキストファイル(日本語込み)をアップロードさせ、
カンマでsplitした値をDBにぶち込みます。

そこで問題にぶち当たりました。

DynaActionForm fb = (DynaActionForm) form;
FormFile ff = (FormFile) fb.get("fileName");
InputStream is = ff.getInputStream();
InputStreamReader = new InputStreamReader(is, "MS932");

として、ファイルの内容を組み立てていくのですが、
送信されたテキストファイルが EUCの場合は正しい日本語が取得できません。
Shift_JISならOKなのですが・・・

しかも、今作っているアプリは i18n の実装で、
日本語のみとは限らない罠があります。

うけとった、ファイル(エンコーディング不明)を
適切にデコードできるようなやりかたはないでしょうか。
もしくは、この文字列はEUCだ!みたいにわかれば便利だなぁ・・・と。(汗)

そもそも、アップロードはバイナリ形式で行われるので
テキストファイルをアップロードして解析するほうがタブーなのかもしれませんが・・・

ファイルアップロード時に、セレクトボックスでエンコードを選択しなさいっていうのも
ダサいですし。。。(泣)

皆様の知恵をお貸しください。

[ メッセージ編集済み 編集者: raystar 編集日時 2004-08-31 14:28 ]
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2004-08-31 15:39
 HttpServletRequest.setCharacterEncoding()には、"JISAutoDetect"というのが使用できるらしいが、これって使えるのかな?

テストデータでは、Shift-JISとEUC-JPはOK、Unicode, UTF-8はNG、JISはファイルリードに失敗しました。。。


 私は「1行目はこれ」って決めてもらい、可能性のあるエンコードをすべて試すことにしました

[ メッセージ編集済み 編集者: Jitta 編集日時 2004-08-31 15:46 ]
raystar
ぬし
会議室デビュー日: 2003/01/16
投稿数: 251
お住まい・勤務地: Tokyo/Japan
投稿日時: 2004-08-31 15:51
Jittaさん

レスありがとうございます。
たしかに、EUC-JPのデータも 適切にEUC-JPに変換してあげれば、
ちゃんとしたデータになるのを確認しています。

一行目は

登録用ファイル

と入力してもらい、

Localeが ja の場合、 MS932 or EUC-JP で変換し、
ちゃんと登録用ファイルと変換できた場合そのエンコーディングを適用する

とします。

そうした場合、 i18n、UTF-8で動作しておりますので韓国語や中国語のときは
死にそうですねぇ・・・・

くぅ。。。
raystar
ぬし
会議室デビュー日: 2003/01/16
投稿数: 251
お住まい・勤務地: Tokyo/Japan
投稿日時: 2004-08-31 17:31
面白いものができました。

java.nio.charset.Charsetに 使用可能文字セットを取得できるメソッドがありました。
Map形式で戻ってくるので Iterator にしてまわしてみました。

log というファイルを作成し、
”こんにちは”と入力して保存。

このファイルを使用可能文字セット文まわしてみました。

これつかえますかね・・・


import java.nio.charset.*;
import java.util.*;
import java.io.*;

public class CharSetSample {

public static void main(String[] args) {

long time = System.currentTimeMillis();

Map charMap = Charset.availableCharsets();
Set set = charMap.keySet();

Iterator it = set.iterator();

while (it.hasNext()) {

String encoding = it.next().toString();

System.out.println(encoding);

try {
FileInputStream fis = new FileInputStream("log.txt");
InputStreamReader ir = new InputStreamReader(fis , encoding);

BufferedReader br = new BufferedReader(ir);

System.out.println(br.readLine());

br.close();
ir.close();
fis.close();

} catch(Exception ex) {
ex.printStackTrace();
}


}

System.out.println((System.currentTimeMillis() - time));

}

}
ちょま吉
大ベテラン
会議室デビュー日: 2004/08/04
投稿数: 112
投稿日時: 2004-09-01 00:41
JISAutoDetectはあまり信用できないと聞いてましたのでちょっとだけ調べてみました。

とあるサイトに下のような内容が書かれていました。
引用:
"JISAutoDetect"をエンコード指定することにより、ある程度の識別が可能です。
ただし、Shift-JISで書かれた'−'や'〜'などの文字を読み込む場合、
JDK1.1.8, JDK1.2以降のWindows環境とそれ以外のプラットフォームでは、
UNICODEへの変換方法に違いがあるので注意が必要です。



java.nio.charset.Charsetはエンコード名が取得できますが、どのエンコードなのかを判断することはできないみたいですね。

難しいですね。いっそのことXMLでアップさせるとか。。。。

[ メッセージ編集済み 編集者: ちょま吉 編集日時 2004-09-01 00:42 ]
raystar
ぬし
会議室デビュー日: 2003/01/16
投稿数: 251
お住まい・勤務地: Tokyo/Japan
投稿日時: 2004-09-01 10:00
ちょま吉さん、レスありがとうございます。

なるほど、XMLだと
<?xml version="1.0" encoding="Shift_JIS"?>
と入力してもらえば、簡単にとれるわけですね。
これだと、インテグレーションが簡単です。

例えば、ユーザ一括登録などの機能を実装するときに
XMLで送信してくださいっていうのは、メジャーなのでしょうか。
むしろ、これからメジャーになるのかな?!
uk
ぬし
会議室デビュー日: 2003/05/20
投稿数: 1155
お住まい・勤務地: 東京都
投稿日時: 2004-09-01 13:06
引用:

raystarさんの書き込み (2004-09-01 10:00) より:
例えば、ユーザ一括登録などの機能を実装するときに
XMLで送信してくださいっていうのは、メジャーなのでしょうか。
むしろ、これからメジャーになるのかな?!


システム間のデータ交換の手段としてはメジャーになりつつありますが、ユーザが直接扱う
形式としては、まだメジャーとはいえませんね。ただ、Microsoft OfficeあたりもXMLでの
ファイル出力をサポートしつつあるので、その形式で送ってもらうというのはありかも
しれません。
SJ0392
ベテラン
会議室デビュー日: 2004/02/05
投稿数: 62
お住まい・勤務地: 神奈川・横浜
投稿日時: 2004-09-02 14:43
バイナリ形式でファイルを扱うのなら InputStreamReader ではなく InputStream じゃないでしょうか?
InputStream はバイナリストリーム、InputStreamReader はキャラクタストリームですよね。

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