0

私が取り組んでいるアプリケーションは、ファイルから情報を読み取ってデータベースに入力します。ファイル内の一部の文字は、アクセント付きのフランス語の文字など、英語以外のものです。

アプリケーションは Windows では正常に動作していますが、Solaris マシンでは特殊文字を認識できず、例外がスローされています。たとえば、「Gérer」でアクセント付きの e に遭遇すると、次のように表示されます:-

      遭遇: "\u0161" (353)、後: "\'G\u00c3\u00a9rer les mod\u00c3"

(アプリケーションからスローされる例外)

これを防ぐには、JVM の file.encoding プロパティを変更する必要があると思います。System.setProperty() を介してこれを実行しようとしましたが、エラーの発生が停止しませんでした。

私ができることについて何か提案はありますか?/etc/default/init にある solaris プラットフォームの基本ロケールを UTF-8 に設定することを考えていました。これが役立つと思う人はいますか?

どんな考えでも大歓迎です。

4

8 に答える 8

4

native2ascii間違ったパラメーターを使用して変換されたファイルのようです。実演するために、内容を含むファイルを作成します

Gérer les modÚ

エンコーディングUTF-8で「a.txt」として保存します。次に、次のコマンドを実行します。

native2ascii -encoding windows-1252 a.txt b.txt

新しいファイルを開くと、次のように表示されます。

G\u00c3\u00a9rer les mod\u00c3\u0161

プロセスを逆にしますが、今回は ISO-8859-1 を指定します。

native2ascii -reverse -encoding ISO-8859-1 b.txt c.txt

新しいファイルを UTF-8 として読み取ると、次のように表示されます。

Gérer les modÀ\u0161

「é」は正常に回復しますが、アプリのように「Ú」で窒息します。

あなたのアプリで何が問題なのかはわかりませんが、native2ascii の誤った使用がその一部であることは間違いありません。これはおそらく、アプリにシステムの既定のエンコーディングを使用させた結果です。ファイルやデータベースなど、テキストを保存するときは常にエンコーディングを指定する必要があります。デフォルトのままにしないでください。他のものを選択する正当な理由がない場合は、UTF-8 を使用してください。

于 2008-10-30T18:45:45.683 に答える
2

使ってみて

java -Dfile.encoding=UTF-8 ...

両方のシステムでアプリケーションを起動するとき。

問題を解決する別の方法は、エンコーディングを両方のシステムから UTF-8 に変更することですが、私は最初のオプションを好みます (システムへの影響が少ない)。

編集:

stackoverflow でこの回答を確認してください。次のいずれかに役立つ場合があります。

String(byte[]) のデフォルトのエンコーディングを変更する

于 2008-10-30T17:03:30.053 に答える
1

コマンドを実行することで、このエラーを回避できました

export LC_ALL='en_GB.UTF-8'

このコマンドは、私が使用していたシェルのロケールを設定しました。これにより、すべての LC_ 環境変数が Unicode ファイル エンコーディングに設定されました。

あなたのすべての提案に感謝します。

于 2008-10-31T11:58:23.503 に答える
1

システム全体の文字エンコーディングを設定する代わりに、特定のテキスト データを読み書きするときに文字エンコーディングを指定する方が簡単で堅牢な場合があります。アプリケーションはどのようにファイルを読み取っていますか? すべての Java I/O パッケージ リーダーおよびライターは、テキストをバイトから読み書きするときに使用する文字エンコーディング名の受け渡しをサポートしています。指定しない場合は、プラットフォームのデフォルトのエンコーディングが使用される可能性があります。

一部のデータベースでは、受け入れることができるテキスト エンコーディングが驚くほど制限されています。Java アプリケーションが適切なエンコーディングでファイルをテキストとして読み取る場合、必要に応じてデータベースに出力できます。データベースが非 ASCII 文字を含むエンコーディングをサポートしていない場合は、最初に非英語テキストを UTF-8 バイトなどにエンコードし、次にそれらのバイトを ASCII テキストとして Base64 エンコードする必要がある場合があります。 .

PS:String.getBytes()表示されている理由とまったく同じ理由で、文字エンコーディング引数なしで使用しないでください。

于 2008-10-30T23:34:04.197 に答える
0

問題を解決するために、さらに多くの情報が必要になると思います。

  1. どの例外が正確に発生し、発生時にどのメソッドを呼び出していますか。
  2. 入力ファイルのエンコーディングは何ですか?UTF8?UTF16 / Unicode?ISO8859-1?

関連するコードスニペットを提供していただければ助かります。

また、私が指摘したいいくつかのこと:

  1. 問題は「é」では発生していませんが、後で発生します。
  2. アプリケーションのどこかで文字エンコードがハードコーディングされているようです。
于 2008-10-31T00:52:23.227 に答える
0

また、UTF-8をサポートするオペレーティングシステムパッケージ(SUNWeulux、SUNWeulufなど)がインストールされていることを確認することもできます。

于 2008-10-31T01:22:35.023 に答える
0

Java は、ファイルの読み取りと書き込み中にオペレーティング システムのデフォルトのエンコーディングを使用します。今、決してそれに頼るべきではありません。エンコーディングを明示的に指定することは常に良い習慣です。

Java では、読み書きに以下を使用できます。

読む:

BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(inputPath),"UTF-8"));

書き込み:

PrintWriter pw = new PrintWriter(new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outputPath), "UTF-8")));
于 2010-05-24T06:16:13.183 に答える
0

so のように、コマンド ラインでエンコーディングを設定することもできますjava -Dfile.encoding=utf-8

于 2008-10-30T17:03:45.747 に答える