2009-04-21 1 views
3

Solarisのファイル名にアクセント付きのファイルを書き込めないという問題があります。SolarisでJavaを使用したファイル名のアクセント

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? 

と私が呼ばれるファイルを取得、次のコードを取得、次を考える

"テスト?? rtkuoの?"

StackOverflowで見つかった情報に基づいて、起動時に「-Dfile.encoding = UTF-8」を追加してJavaアプリケーションを呼び出そうとしました。 これは、次のような出力

Charset = UTF-8 
testéörtkuoë 

を返しますが、ファイル名は、まだある "テスト?? rtkuo?"

ご迷惑をおかけして申し訳ありません。

ステフ

+0

あなたは(ユニコードリテラルを使用する場合は、同じ問題を取得してください\ uXXXXという)実際のソースファイルにユニコードを持つ代わりに?ファイルシステムはUTF-8ファイル名を確実にサポートしていますか?ファイルシステム上のファイルを表示するために使用しているツール(ls?)がそれらをサポートしていますか? –

答えて

1

あなたはAPIをIOのJavaでファイル名を一覧表示しようとすると、あなたは何を見ていますか?それらは正しくエンコードされていますか?実際の問題がファイル名をエンコードしているのか、それらをチェックするために使用しているツールであるのか不思議です。あなたが行うときに何が起こる

+0

この問題は、APIを使用してファイル名をリストするときにも発生します。私がファイルを表示するために使用するツールは、シェルからの単純な "ls"です。 "ls"を使うと、アクセントのある他のファイルを見ることができます。しかし、シェルではアクセントに文字を付けることができないので、Solaris環境で問題が発生する可能性があります。 –

0

ls > testéörtkuoë 

それがはたらく場合(正しくファイルへの書き込み)、その後、あなたがアクセントの付いたファイルに書き込むことができます知っています。

+0

Solarisシェルにアクセント付きの文字を入力できないため、これが機能しません。しかし、私はlsをすればアクセント付きで他のファイルを見ることができます。これはSolaris環境の設定に問題がある可能性があります –

+0

ファイル名をシェルに貼り付けることはできますか? – Elijah

+0

いいえ、これはうまくいきません。貼り付け時にアクセント付きの文字がスキップされる –

4

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

エディタはISO-8859-1を使用している場合、私はそれがようEEOエンコードするために期待する:

:エディタがUTF-8を使用している場合、私はそれがようEEOエンコードするために期待する

eb e9 f6 

c3ab c3a9 c3b6 

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

Unicode escape sequencesを使用した場合、ソースファイルは移植性が向上します。少なくとも、コンパイラがエディタと同じエンコーディングを使用していることが必要です。

例:

ë \u00EB 
é \u00E9 
ö \u00F6 

あなたはUnicode chartsを使用してこれらの値を調べることができます。

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

ここにはproblems you might see on Windowsと類似点があります。

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

0

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

  1. :ドキュメントに記載されているよう

    、的環境変数file.encodingは文字セットを定義するために使用されるべきではないと、この場合には、JVMはそれを

    症状を無視しますシェルのアクセント。

  2. ls
  3. File.list()は環境file.encodingは環境user.(language|country)が出力

ソリューションに影響を与えていなかった出力

  • に影響を与えていなかった不正な値
  • を印刷して、正しい値を示しました。

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

    $ 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 
    
  • 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"))); 
    
    関連する問題