- - PR -
struts ファイルアップロードの文字エンコーディングについて
| 投稿者 | 投稿内容 | ||||
|---|---|---|---|---|---|
|
投稿日時: 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 ] | ||||
|
投稿日時: 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 ] | ||||
|
投稿日時: 2004-08-31 15:51
Jittaさん
レスありがとうございます。 たしかに、EUC-JPのデータも 適切にEUC-JPに変換してあげれば、 ちゃんとしたデータになるのを確認しています。 一行目は 登録用ファイル と入力してもらい、 Localeが ja の場合、 MS932 or EUC-JP で変換し、 ちゃんと登録用ファイルと変換できた場合そのエンコーディングを適用する とします。 そうした場合、 i18n、UTF-8で動作しておりますので韓国語や中国語のときは 死にそうですねぇ・・・・ くぅ。。。 | ||||
|
投稿日時: 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-09-01 00:41
JISAutoDetectはあまり信用できないと聞いてましたのでちょっとだけ調べてみました。
とあるサイトに下のような内容が書かれていました。
java.nio.charset.Charsetはエンコード名が取得できますが、どのエンコードなのかを判断することはできないみたいですね。 難しいですね。いっそのことXMLでアップさせるとか。。。。 [ メッセージ編集済み 編集者: ちょま吉 編集日時 2004-09-01 00:42 ] | ||||
|
投稿日時: 2004-09-01 10:00
ちょま吉さん、レスありがとうございます。
なるほど、XMLだと <?xml version="1.0" encoding="Shift_JIS"?> と入力してもらえば、簡単にとれるわけですね。 これだと、インテグレーションが簡単です。 例えば、ユーザ一括登録などの機能を実装するときに XMLで送信してくださいっていうのは、メジャーなのでしょうか。 むしろ、これからメジャーになるのかな?! | ||||
|
投稿日時: 2004-09-01 13:06
システム間のデータ交換の手段としてはメジャーになりつつありますが、ユーザが直接扱う 形式としては、まだメジャーとはいえませんね。ただ、Microsoft OfficeあたりもXMLでの ファイル出力をサポートしつつあるので、その形式で送ってもらうというのはありかも しれません。 | ||||
|
投稿日時: 2004-09-02 14:43
バイナリ形式でファイルを扱うのなら InputStreamReader ではなく InputStream じゃないでしょうか?
InputStream はバイナリストリーム、InputStreamReader はキャラクタストリームですよね。 | ||||
