Linux サーバー上で実行されるが、cp-1252 を文字セットとして使用して従来の Windows マシンで生成されたファイルを処理する Java アプリを作成しようとしています。これらのファイルを、生成された cp-1252 ではなく utf-8 としてエンコードする方法はありますか?
2 に答える
ファイル名とコンテンツに問題がある場合、問題を解決する最も簡単な方法は、Linux マシンの をではなくlocale
に基づいたものに設定することです。を使用して、使用可能なロケールを一覧表示できます。たとえば、次のように使用できます。ISO-8859-1
UTF-8
locale -a
en_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/
任意のエンコーディングでテキスト データを読み書きできます。簡単なコード例を次に示します。
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 を指定しました。