2

Linux サーバー上で実行されるが、cp-1252 を文字セットとして使用して従来の Windows マシンで生成されたファイルを処理する Java アプリを作成しようとしています。これらのファイルを、生成された cp-1252 ではなく utf-8 としてエンコードする方法はありますか?

4

2 に答える 2

4

ファイル名とコンテンツに問題がある場合、問題を解決する最も簡単な方法は、Linux マシンの をではなくlocaleに基づいたものに設定することです。を使用して、使用可能なロケールを一覧表示できます。たとえば、次のように使用できます。ISO-8859-1UTF-8locale -aen_US.iso88591

export LANG=en_US.iso88591

このように、Java はファイル名に ISO-8859-1 を使用しますが、おそらくこれで十分です。Java プログラムを実行するには、file.encodingシステム プロパティを設定する必要があります。

java -Dfile.encoding=cp1252 -cp foo.jar:bar.jar blablabla

ISO-8859-1 ロケールが利用できない場合は、 で生成できますlocaledef。ただし、インストールにはルートアクセスが必要です。実際、CP-1252 がシステムで使用可能な場合は、それを使用するロケールを生成できます。例えば:

sudo localedef -f CP1252 -i en_US en_US.cp1252
export LANG=en_US.cp1252

このように、Java はファイル名を含むすべての I/O にデフォルトで CP1252 を使用する必要があります。

ここでさらに展開: http://jonisalonen.com/2012/java-and-file-names-with-invalid-characters/

于 2012-08-21T14:30:21.883 に答える
3

任意のエンコーディングでテキスト データを読み書きできます。簡単なコード例を次に示します。

  public static void main(String[] args) throws Exception
  {
    // List all supported encodings
    for (String cs : Charset.availableCharsets().keySet())
      System.out.println(cs);

    File file = new File("SomeWindowsFile.txt");
    StringBuilder builder = new StringBuilder();

    // Construct a reader for a specific encoding
    Reader reader = new InputStreamReader(new FileInputStream(file), "windows-1252");
    while (reader.ready())
    {
      builder.append(reader.read());
    }
    reader.close();

    String string = builder.toString();

    // Construct a writer for a specific encoding
    Writer writer = new OutputStreamWriter(new FileOutputStream(file), "UTF8");
    writer.write(string);
    writer.flush();
    writer.close();
  }

これでも読み取り時に「チョーク」する場合は、元のエンコーディングが自分の考えと同じであることを確認できるかどうかを確認してください。この場合、cp-1252 の Java 文字列である windows-1252 を指定しました。

于 2012-08-20T22:03:10.927 に答える