3

Solaris でファイル名にアクセント記号を含むファイルを書き込めないという問題があります。

次のコードを考える

public static void main(String[] args) {
    System.out.println("Charset = "+ Charset.defaultCharset().toString());
    System.out.println("testéörtkuoë");
    FileWriter fw = null;
    try {
        fw  = new FileWriter("testéörtkuoë");
        fw.write("testéörtkuoëéörtkuoë");
        fw.close();

次の出力が得られます

Charset = ISO-8859-1
test??rtkuo?

「test??rtkuo?」というファイルを取得します。

StackOverflow で見つけた情報に基づいて、起動時に「-Dfile.encoding=UTF-8」を追加して Java アプリを呼び出そうとしました。これにより、次の出力が返されます

Charset = UTF-8
testéörtkuoë

しかし、ファイル名はまだ「test??rtkuo?」です。

どんな助けでも大歓迎です。

ステフ

4

5 に答える 5

4

これらの文字はすべてISO-8859-1に存在します。問題の一部は、コード エディターが、オペレーティング システムが使用しているエンコードとは異なるエンコードでファイルを保存していることにあると思われます。

エディターが ISO-8859-1 を使用している場合、私はそれが ëéö を次のようにエンコードすることを期待します:

eb e9 f6

エディターが UTF-8 を使用している場合、私はそれが ëéö を次のようにエンコードすることを期待します。

c3ab c3a9 c3b6

他のエンコーディングは異なる値を生成します。

Unicode エスケープ シーケンスを使用すると、ソース ファイルの移植性が向上します。少なくとも、コンパイラがエディタと同じエンコーディングを使用していることを確認してください。

例:

ë    \u00EB
é    \u00E9
ö    \u00F6

これらの値は、Unicode グラフを使用して調べることができます。

-Dfile.encoding=UTF-8 を使用してデフォルトのファイル エンコーディングを変更すると、JVM がシステムとやり取りする方法に予期しない結果が生じる可能性があります。

ここには、Windows で発生する可能性のある問題との類似点があります。

問題を直接再現することはできません。OpenSolaris の私のバージョンでは、デフォルトのエンコーディングとして UTF-8 を使用しています。

于 2009-04-21T16:00:45.797 に答える
1

If you attempt to list the filenames with the java io apis, what do you see? Are they encoded correctly? I'm curious as to whether the real problem is with encoding the filenames or with the tools that you are using to check them.

于 2009-04-21T15:10:24.543 に答える
0

同様の問題が発生しました。その例とは異なり、プログラムは、が正しい値を示していたsysout.printlnにもかかわらず、を使用してファイルを正しくリストできませんでした。ls

ドキュメントで説明されているように、環境変数file.encodingを使用して文字セットを定義しないでください。この場合、JVMはそれを無視します。

症状:

  1. シェルにアクセントを入力できませんでした。
  2. ls正しい値を示していた
  3. File.list()間違った値を印刷していました
  4. 環境file.encodingは出力に影響を与えていませんでした
  5. 環境user.(language|country)は出力に影響を与えていませんでした

ソリューション:

コマンドでリストされているように、環境変数LC_*は/ etc / defaut / initから継承された値でシェルに設定されましたがset、ロケールは異なる値を示しました。

$ set | grep LC
LC_ALL=pt_BR.ISO8859-1
LC_COLLATE=pt_BR.ISO8859-1
LC_CTYPE=pt_BR.ISO8859-1
LC_MESSAGES=C
LC_MONETARY=pt_BR.ISO8859-1
LC_NUMERIC=pt_BR.ISO8859-1
LC_TIME=pt_BR.ISO8859-1

$ locale
LANG=
LC_CTYPE="C"
LC_NUMERIC="C"
LC_TIME="C"
LC_COLLATE="C"
LC_MONETARY="C"
LC_MESSAGES="C"
LC_ALL=

解決策は、LANGをエクスポートすることでした。この環境変数は実際にjvmに影響を与えます

LANG=pt_BR.ISO8859-1
export LANG
于 2010-05-19T21:51:56.150 に答える
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:02:42.747 に答える