3

この質問は、MySQL (5.5.16) データベースに接続されている Tomcat 7 Web アプリケーションに関するものです。

zipcharset でエンコードされたファイル名を持つファイルを開くとwindows-1252、文字は Java によって正しく解釈されるようです。

ZipFile zf = new ZipFile( zipFile, Charset.forName( "windows-1252" ) );
Enumeration entries = zf.entries();
while( entries.hasMoreElements() ) {
    ZipEntry ze = ( ZipEntry ) entries.nextElement();
    if( ! ze.isDirectory() ) {
        String name = ze.getName();
        System.out.println( name ); //prints correct filenames, e.g. café.pdf
    }
}

ZipFile コンストラクターで Charset オブジェクトを省略すると、例外が発生します。zip ファイル内のファイル名は、分音符号を含めて標準出力に正しく出力されます。しかし、後でファイル名をデータベースに保存しようとすると、e-acute が疑問符に置き換えられます (mysql コンソール クライアントで見られるように)。以前は、Web アプリケーションから MySQL に特殊文字を挿入する際に問題はありませんでした。

éJava ソース コードでINSERT を実行すると、次のようになります。

statement.executeUpdate( "insert into files (filename) values ('café.pdf')" );

これéはMySQLでうまく表示されます。

また、私のログファイルには、代わりにコンマが表示されますé: caf‚.pfd

ここで何が起こっているのか知っている人はいますか?

4

3 に答える 3

1

コメント セクションで述べたように、受信データ (zip ファイルの名前) は異なる文字セットにすることができます。MySQL+JDBC リンクを使用しているため、これは問題になるでしょう。多くの制限があります (MySQL では列ごとに 1 つの文字セット、JDBC では接続ごとに 1 つの文字セットのみなど)。

したがって、 MySQL 側の文字セット (character_set_serverや などの変数を探します) を UTF8 に切り替えることをお勧めします。これにより、受信する可能性のあるほぼすべての文字を転送および保存できるようになります。MySQL サーバーを適切にセットアップする方法については、こちらcharacter_set_connectionを参照してください。MySQL サーバーの設定は難しい場合があるので、追加のヘルプが必要な場合は PM までお気軽にお問い合わせください。JDBC はサーバーの変数に合わせて自動的に調整されるため、Java アプリケーションを変更する必要はありません。character_set_connection

アプリケーションで変更しなければならないことの 1 つは、MySQL サーバーに送信して保存するために、すべての受信データを UTF8 に変換する必要があることです。

幸運を。

于 2012-06-29T12:19:14.530 に答える
0

問題は解決しました。この投稿は、ファイル内のファイル名のエンコーディングがではなく、である可能性があることを示唆していzipます。からの変更:windows-1252IBM437Charset

ZipFile zf = new ZipFile( zipFile, Charset.forName( "windows-1252" ) );

ZipFile zf = new ZipFile( zipFile, Charset.forName( "IBM437" ) );

望ましい結果が得られました。取得したファイル名をMySQLに保存すると、éで正しく保存されました。

何が悪かったのか?

zipファイルに含まれているファイル名を標準出力に印刷します。

System.out.println( name );

zipファイル内のファイル名が適切に解釈windows-1252されていると誤解しました。エンコーディングを使用してzipファイルを開くと、ファイル名は発音区別符号(cafe.pdf)で標準出力に適切に出力されました。他の文字エンコードを使用すると、éの代わりに異なる記号が表示されました。

しかし、この回答を使用しUnicodeてé-の値を出力すると、エンコードを使用してzipファイルを開くと、実際のUnicode値は(ラテン語の小文字のeと鋭角)ではなく(単一引用符- 9引用符)。文字セットを使用してを開くと、正しいUnicode値DIDが表示されます。charwindows-1252\u00e9\u201aZipFileIBM437

もちろん、Stringを使用して標準出力に出力するPrintStream場合、PrintStreamは特定の文字エンコードにも関連付けられます。PrintStreamJavadocから:

PrintStreamによって印刷されるすべての文字は、プラットフォームのデフォルトの文字エンコードを使用してバイトに変換されます。

私はWindowsXPに取り組んでいます。新しいものを作成したときPrintStream

out = new PrintStream( System.out, true, "IBM437" );

すべてが理にかなっています。IBM437文字エンコードでzipファイルを開き、新しいPrintStreamを使用すると、éが正しく印刷されました。

プレーンテキストのようなものはありません。

于 2012-07-02T09:41:42.760 に答える
0

データを保存するテーブルでは、e-acute 文字を保存できるように正しい照合順序を使用していることを確認してください

于 2012-06-29T10:43:05.440 に答える