0

Oracle DB テーブルからデータを選択し、そのデータを csv ファイルとプレーン パイプで区切られたテキスト ファイルにダンプする必要があります。ユーザーが生成されたcsv /テキストファイルを表示できるように、アプリケーションでユーザーにリンクを提供します。

多くの解析が含まれていたため、Unix シェル スクリプトを作成し、Struts/J2ee アプリケーションから呼び出しています。

以前は、生成されたファイルで中国語とローマ字が失われ、生成されたファイルには us-ascii charset (使用してチェックされた-> file -i) が含まれていました。後で使用する NLS_LANG=AMERICAN_AMERICA.AL32UTF8と、utf-8 形式のファイルが得られました。

それでも文字が意味不明だったので、iconv コマンドを試して、utf-8 ファイルを utf-16le charset に変換しました。 iconv -f utf-8 -t utf-16le $recordFile > $tempFile

これは、生成されたテキスト ファイルに対して正常に機能します。しかし、CSV では、中国語とローマ字はまだ正しくありません。この csv ファイルをメモ帳で開き、キーボードから Enter キーを押して改行を入力したら、保存します。MS-Excel で開くと、中国語とローマ字を含むすべての文字が正常に表示されますが、テキストは列ではなく行ごとに 1 行になりました。

何が起こっているのかわからない。

Java コード

PrintWriter out = servletResponse.getWriter(); 
servletResponse.setContentType("application/vnd.ms-excel; charset=UTF-8");
servletResponse.setCharacterEncoding("UTF-8");
servletResponse.setHeader("Content-Disposition","attachment; filename="+ fileName.toString());                   
FileInputStream fileInputStream = new FileInputStream(fileLoc + fileName);  
int i;   
while ((i=fileInputStream.read()) != -1) {  
 out.write(i);   
} 
fileInputStream.close();   
out.close();    

詳細を見逃した場合はお知らせください。これを通過するために時間を割いてくれてありがとう。

4

2 に答える 2

2

解決できました。最初にアーロンが言及したUTF-16LEように、将来の問題を回避するためにエンコーディングを削除し、エンコードされたファイルをUTF-8. PrintWriterJava コードを に変更OutputStreamし、テキスト ファイルで正しい文字を確認できました。

CSV にはまだゴミが表示されていました。BOM認識しているソフトウェアが必要とするため、ファイルの先頭に EF BB BF を追加する必要があることがわかりましたMS-Excel。以下のようにJavaコードを変更すると、csvのトリックが行われました。

OutputStream out = servletResponse.getOutputStream();
os.write(239); //0xEF
os.write(187); //0xBB
out.write(191); //0xBF               
FileInputStream fileInputStream = new FileInputStream(fileLoc + fileName);  
int i;   
while ((i=fileInputStream.read()) != -1) {  
    out.write(i);   
} 
fileInputStream.close();  
out.flush();
out.close();
于 2014-12-30T09:32:08.487 に答える