391

JVM (1.5.x) で使用されるデフォルトの文字エンコーディングをプログラムで正しく設定するにはどうすればよいですか?

-Dfile.encoding=whatever以前は、古い JVM の方法であったことを読んだことがあります。私が入りたくない理由で、私はその贅沢を持っていません。

私が試してみました:

System.setProperty("file.encoding", "UTF-8");

getBytesプロパティは設定されますが、以下の最終呼び出しで UTF8 が使用されるようには見えません。

System.setProperty("file.encoding", "UTF-8");

byte inbytes[] = new byte[1024];

FileInputStream fis = new FileInputStream("response.txt");
fis.read(inbytes);
FileOutputStream fos = new FileOutputStream("response-2.txt");
String in = new String(inbytes, "UTF8");
fos.write(in.getBytes());
4

19 に答える 19

346

残念ながら、file.encodingJVM の起動時にプロパティを指定する必要があります。メイン メソッドが入力されるまでに、およびString.getBytes()のデフォルト コンストラクタで使用される文字エンコーディングが永続的にキャッシュされます。InputStreamReaderOutputStreamWriter

Edward Grech が指摘しているように、このような特殊なケースでは、環境変数JAVA_TOOL_OPTIONS 使用してこのプロパティを指定できますが、通常は次のように行われます。

java -Dfile.encoding=UTF-8 … com.x.Main

Charset.defaultCharset()プロパティへの変更が反映されますがfile.encoding、デフォルトの文字エンコーディングを決定する必要があるコア Java ライブラリのほとんどのコードは、このメカニズムを使用しません。

エンコードまたはデコードするときは、file.encodingプロパティを照会するかCharset.defaultCharset()、現在の既定のエンコードを検索し、適切なメソッドまたはコンストラクター オーバーロードを使用してそれを指定できます。

于 2008-12-12T05:56:25.507 に答える
181

JVM™ ツール インターフェイスのドキュメントから…</p>

コマンドラインは常にアクセスまたは変更できるとは限らないため、たとえば組み込み VM やスクリプト内で起動された単に VM などでJAVA_TOOL_OPTIONSは、これらの場合にエージェントを起動できるように変数が提供されます。

(Windows) 環境変数JAVA_TOOL_OPTIONSをに設定すると、JVM が開始されるたびに-Dfile.encoding=UTF8(Java)プロパティが自動的に設定されます。System次のメッセージが に送信されるため、パラメータが取得されたことがわかりますSystem.err

Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF8

于 2009-03-08T04:31:50.240 に答える
77

私は間違いなくうまくいくハッキーな方法を持っています!!

System.setProperty("file.encoding","UTF-8");
Field charset = Charset.class.getDeclaredField("defaultCharset");
charset.setAccessible(true);
charset.set(null,null);

このようにして、文字セットが設定されていないと考える JVM をだまして、実行時に UTF-8 に設定し直すことができます。

于 2013-02-20T19:09:04.880 に答える
39

プラットフォームのデフォルトの文字セットを設定するよりも良いアプローチだと思います。特に、プラットフォームはもちろん、アプリケーションの展開に影響を与えることに制限があるように思われるため、はるかに安全なString.getBytes("charsetName"). そうすれば、アプリケーションは制御できないものに依存しなくなります。

String.getBytes()私が見た多くのケースで、開発者がデフォルトの文字セットが変更される可能性を考慮していないという深刻な問題を引き起こしているため、これは非推奨にする必要があると個人的に感じています。

于 2008-12-12T05:39:49.533 に答える
20

元の質問にはお答えできませんが、アドバイスをしたいと思います。JVM のデフォルトのエンコーディングに依存しないでください。コードで目的のエンコーディング (つまり、「UTF-8」) を明示的に指定するのが常に最善です。そうすれば、異なるシステムや JVM 構成でも機能することがわかります。

于 2008-12-12T05:36:04.237 に答える
13

これを試して :

    new OutputStreamWriter( new FileOutputStream("Your_file_fullpath" ),Charset.forName("UTF8"))
于 2012-01-20T18:09:42.110 に答える
7

いろいろ試してみましたが、ここのサンプルコードは完璧に動作します。 リンク

コードの核心は次のとおりです。

String s = "एक गाव में एक किसान";
String out = new String(s.getBytes("UTF-8"), "ISO-8859-1");
于 2014-07-03T09:33:04.770 に答える
6

私たちは同じ問題を抱えていました。この記事 (および他の記事) からのいくつかの提案を整然と試みましたが、役に立ちませんでした。も追加しようとしましたが-Dfile.encoding=UTF8、何も機能していないようです。

この問題を抱えている人のために、次の記事は、ロケール設定がどのように壊れるかを説明するのに最終的に役立ちましunicode/UTF-8Java/Tomcat

http://www.jvmhost.com/articles/locale-breaks-unicode-utf-8-java-tomcat

ファイルでロケールを正しく設定すると~/.bashrcうまくいきました。

于 2014-01-09T00:46:28.320 に答える
2

私のプロジェクトでこの問題を解決してください。それが誰かを助けることを願っています。

私はLIBGDX Javaフレームワークを使用していますが、Android Studioプロジェクトでもこの問題が発生しました。Mac OS のエンコーディングは正しいですが、Windows 10 では特殊文字と記号、およびロシア語の文字が次のような質問として表示されます: ????? およびその他の不正な記号。

  1. Android Studio プロジェクト設定の変更: File->Settings...->Editor-> File Encodings3 つのフィールドすべて (以下のグローバル エンコーディング、プロジェクト エンコーディング、デフォルト) で UTF-8 に変更します。

  2. 任意の Java ファイル セットで:

    System.setProperty("file.encoding","UTF-8");

  3. テスト印刷のデバッグ ログの場合:

    System.out.println("My project encoding is : "+ Charset.defaultCharset());

于 2020-08-07T13:52:10.217 に答える
1

あなたが何をしているのか明確ではなく、現時点では制御できません。宛先ファイルに別の OutputStream クラスを挿入できる場合は、定義した文字セット (デフォルトでは UTF-8 など) で文字列をバイトに変換する OutputStream のサブタイプを使用できます。変更された UTF-8 で十分な場合は、次を使用できますDataOutputStream.writeUTF(String)

byte inbytes[] = new byte[1024];
FileInputStream fis = new FileInputStream("response.txt");
fis.read(inbytes);
String in = new String(inbytes, "UTF8");
DataOutputStream out = new DataOutputStream(new FileOutputStream("response-2.txt"));
out.writeUTF(in); // no getBytes() here

このアプローチが実行できない場合は、ここで、データ フローと実行環境の観点から制御できるものとできないものを正確に明確にすると役立つ場合があります (ただし、決定するよりも言うのが簡単な場合があることはわかっています)。幸運を。

于 2008-12-16T03:59:32.963 に答える
0

そこに 2 つのシステム プロパティを一緒に設定すると、システムはすべてを utf8 に取り込みます。

file.encoding=UTF8
client.encoding.override=UTF-8
于 2012-01-19T19:23:40.870 に答える