10

組み込み Linux プラットフォームで小さな Java アプリケーションを実行しています。Java VM JamVM を OpenJDK に置き換えた後、特殊文字を含むファイル名が正しく保存されません。ウムラウトなどの特殊文字は疑問符に置き換えられます。

ここに私のテストコードがあります:

import java.io.File;
import java.io.IOException;

public class FilenameEncoding
{

        public static void main (String[] args) {
                String name = "umlaute-äöü";
                System.out.println("\nname = " + name);
                System.out.print("name in Bytes: ");
                for (byte b : name.getBytes()) {
                        System.out.print(Integer.toHexString(b & 255) + " ");
                }
                System.out.println();

                try {
                        File f = new File(name);
                        f.createNewFile();
                } catch (IOException e) {
                        e.printStackTrace();
                }
        }

}

実行すると、次の出力が得られます。

name = umlaute-???
name in Bytes: 75 6d 6c 61 75 74 65 2d 3f 3f 3f

umlaute-??? という名前のファイル 創造された。

プロパティ file.encoding および sun.jnu.encoding を UTF-8 に設定すると、端末で正しい文字列が表示されますが、作成されたファイルは依然としてウムラウト ??? です。

VM を strace で実行すると、システム コールが表示されます

open("umlaute-???", O_RDWR|O_CREAT|O_EXCL|O_LARGEFILE, 0666) = 4

これは、問題がファイル システムの問題ではなく、VM の問題であることを示しています。

ファイル名のエンコーディングはどのように設定できますか?

4

3 に答える 3

4

Eclipse を使用している場合は、[ウィンドウ] -> [設定] -> [一般] -> [ワークスペース] に移動し、プルダウン メニューから必要な [テキスト ファイルのエンコード] オプションを選択します。私の周りを変更することで、問題を再現することができました(また、修正に戻すこともできました)。

そうでない場合は、環境変数をウィンドウに追加できます ([システム プロパティ] -> [環境変数] で、システム変数の下で [新規...] を選択します)。名前は (引用符なし)JAVA_TOOL_OPTIONSで、値は-Dfile.encoding=UTF8(または、あなたのエンコーディングが機能するものなら何でも。

私はこの投稿で答えを見つけました.btw: Setting the default Java character encoding?

Linux ソリューション

-(恒久的)env | grep LANGターミナルで使用すると、Linux が現在どのエンコーディングでセットアップされているかについて 1 つまたは 2 つの応答が返されます。次に、/etc/sysconfig i18n ファイルで LANG を UTF8 に設定できます (お使いのものは ASCII に設定されている可能性があります) (私は 2.6.40 fedora でこれをテストしました)。基本的に、UTF8 (奇妙な文字が含まれていた) から ASCII (疑問符が含まれていた) に切り替えて、元に戻しました。

-(JVM の実行時ですが、問題が解決しない場合があります) Java を使用して、必要なエンコーディングで JVM を開始できます -Dfile.encoding=**** FilenameEncoding 2 つの方法の出力を次に示します。

[youssef@JoeLaptop bin]$ java -Dfile.encoding=UTF8 FilenameEncoding

name = umlaute-הצ�
name in Bytes: 75 6d 6c 61 75 74 65 2d d7 94 d7 a6 ef bf bd 
UTF-8
UTF8

[youssef@JoeLaptop bin]$ java FilenameEncoding

name = umlaute-???????
name in Bytes: 75 6d 6c 61 75 74 65 2d 3f 3f 3f 3f 3f 3f 3f 
US-ASCII
ASCII

ここに Linux に関する参考文献があり ます http://www.cyberciti.biz/faq/set-environment-variable-linux/

-Dfile.encoding デフォルトの Java 文字エンコーディングを設定しますか?

于 2012-04-11T13:51:37.817 に答える
2

私はそれが古い質問であることを知っていますが、私は同じ問題を抱えていました。上記の解決策はすべてうまくいきませんでしたが、次の方法で解決しました。

  • UTF8 へのソース エンコーディング (Maven プロパティの UTF-8 への project.build.sourceEncoding)
  • プログラム引数: -Dfile.encoding=utf8 および -Dsun.jnu.encoding=utf8
  • java.io.File の代わりに java.nio.file.Path を使用する
于 2017-06-17T11:15:57.857 に答える
0

あなたの問題は、ファイルを保存したものとはjavac異なるエンコーディングを期待していることです。.javaコンパイル時に警告しませんでしjavacたか?

おそらく、エンコーディングISO-8859-1またはwindows-1252で保存しており、javac期待してUTF-8いる.

javacフラグを使用して正しいエンコーディングを指定する-encodingか、ビルド ツールに相当するエンコーディングを指定します。

于 2012-04-12T15:19:50.197 に答える