2016-09-29 291 views
1

私のJavaコードを8ビットのために、Linuxの制限ファイル名を行う文字列が問題の文字が楕円チャーであるUNIXシステムの実際のパスJavaエラーは、文字セット

contains unmappable characters: /out/K/Kyuss/?And the Circus Leaves Town/09 - Size Queen.mp3 
java.nio.file.InvalidPathException: Malformed input or input contains unmappable characters: /out/K/Kyuss/?And the Circus Leaves Town/09 - Size Queen.mp3 
    at sun.nio.fs.UnixPath.encode(UnixPath.java:147) 
    at sun.nio.fs.UnixPath.<init>(UnixPath.java:71) 
    at sun.nio.fs.UnixFileSystem.getPath(UnixFileSystem.java:281) 
    at java.io.File.toPath(File.java:2234) 
    at com.jthink.songkong.analyse.analyser.SongSaver.saveRenamedFile(SongSaver.java:891) 
    at com.jthink.songkong.analyse.analyser.SongSaver.realSave(SongSaver.java:809) 
    at com.jthink.songkong.analyse.analyser.SongSaver.saveSongToFile(SongSaver.java:630) 
    at com.jthink.songkong.analyse.analyser.SongSaver.saveChanges(SongSaver.java:190) 
    at com.jthink.songkong.analyse.analyser.SongSaver.call(SongSaver.java:165) 
    at com.jthink.songkong.analyse.analyser.SongSaver.call(SongSaver.java:59) 
    at java.util.concurrent.FutureTask.run(FutureTask.java:266) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
    at java.lang.Thread.run(Thread.java:745) 

に変換する際に問題を有しています'...'(エラーメッセージの出力には?と表示されます)は8ビット文字ではありませんが、なぜ私はUNIXシステムにこのような制限があるのか​​分からなかったのですか?

+0

linuxはスペースがまったく好きではありません(それは許されませんが、linuxのいくつかのプログラムでは痛みがあり、100%すべてで動作しません)、スペースの代わりにアンダースコアを入れると、おそらく解決されるでしょう。それは '/'に問題があり、ディレクトリパスではなくファイル名で使用されていると考えられます。 – jgr208

+0

@ jgr208ありがとうございますが、問題は楕円の文字であることが間違っています –

+0

Linuxマシン用のファイルか、Windows用のファイルですか? – jgr208

答えて

4

Linuxはファイル名をバイト文字列として扱います。彼らが望むバイトストリングを解釈することを選択するアプリケーションです。 More info here.通常、プログラムはファイル名をUTF-8として解釈しますが、これは多くの要因(LANGなど)に依存します。

Javaは、ファイル名が使用するエンコードを推測するために、変数LANGを使用しています。正しく設定されていない場合(たとえば、en_US.UTF-8)、ファイル名がASCIIであると想定され、ASCIIエンコーディングがないため、楕円をエンコードすることを拒否します。

それを再現する小さな例:

import java.io.File; 

public class Test { 
    public static void main(String[] args) { 
     File f = new File("\u2026"); 
     f.toPath(); 
    } 
} 

あなたはLANG=Cでそれを実行する場合は、エラーが発生します。

$ LANG=C java Test 
Exception in thread "main" java.nio.file.InvalidPathException: Malformed input or input contains unmappable characters: ? 
    at sun.nio.fs.UnixPath.encode(UnixPath.java:147) 
    at sun.nio.fs.UnixPath.<init>(UnixPath.java:71) 
    at sun.nio.fs.UnixFileSystem.getPath(UnixFileSystem.java:281) 
    at java.io.File.toPath(File.java:2234) 
    at Test.main(Test.java:6) 

LANG=en_US.UTF-8で実行すると問題なく動作します。

$ LANG=en_US.UTF-8 java Test 
# No crash! 

あなたがLANGを設定せずに、それを実行した場合、それはUnicodeをサポートしていない場合にスローされますされ、あなたのシステムを用いて構成されているものは何でもピックアップします。

残念ながら、あなたのプログラムからこの動作を修正する簡単な方法はありません。 UnixPath.encodeCharset.defaultCharset()there's no way to change it at runtimeを使用します。 LANGが正しく設定されていることを確認する必要があります。

+0

偉大な答え、ちょうどこれが問題であるかどうか確認するために顧客が応答するのを待つ –

+0

はいそれは顧客のためにそれを固定しました:) –

関連する問題