0

netbeans で起動したときに正常に動作するコードがあります (このコードは、.odt ファイルから抽出された content.xml ファイルの一部の文字列を置き換えます)。

String cont = new String(Utils.readBinaryFile(path + "/content.xml"));
for (Patterns p : patterns) {
    cont = cont.replaceAll(p.search.replaceAll("\\{", "\\\\{"), p.replace.replaceAll("\n", "<text:line-break/>").replaceAll("\\{", "\\\\{"));
}
Utils.saveToFile(path + "/content.xml", cont.getBytes("UTF-8"), false);

/**
 * Saves the binary data to the file, if append is FALSE, the data in the file is overwritten
 * @param fileName
 * @param data
 * @param append 
 */
    public static void saveToFile(String fileName, byte[] data, boolean append) {
    try {
        try (FileOutputStream out = new FileOutputStream(fileName, append)) {
        out.write(data);
        }
    } catch (IOException iOException) {
        System.err.println(iOException.getMessage());
    }
    }

java -jar ....のようなコマンドラインでWindowsのコードを使用すると、ファイルに保存された文字が変換されなくなります。私の場合、CP1250 のエンコードで Windows が機能し、Java -jar としてコードを開始すると CP1250 が使用されるという事実から来ていることがわかりました。問題は、これをうまく機能させる方法ですか? コマンド ラインではそのコードを使用しませんが、アプレットでは、アプレットから実行されるコードは、CP1250 のコマンド ラインから実行されるコードとまったく同じように動作します。

エンコーディングに関する多くの記事を読みましたが、何も役に立たないようでしたが、指定されたエンコーディングでコマンドラインから実行しています:

java -Dfile.encoding=utf-8 -jar Office.jar

問題を解決しました。

次に、アプレット タグに引数を渡したいことに気付きました。

<object classid='clsid:8AD9C840-044E-11D1-B3E9-00805F499D93' width='500' height='30'> 
    <param name='codebase_lookup' value='false'> 
    <param name='archive' value='" . ServerURL . "/applets/Office/Office.jar'> 
    <param name='code' value='OfficeApplet'> 
    <param name='java_arguments' value='-Dfile.encoding=utf-8'
    <param name='data' value='" . $dataJSON . "'> 
    <comment> 
        <embed 
            codebase_lookup='false' 
            archive='" . ServerURL . "/applets/Office/Office.jar' 
            code='OfficeApplet' 
            width='500' 
            height='30'
            java_arguments='-Dfile.encoding=utf-8'
            data='" . $dataJSON. "' 
            type='application/x-java-applet' 
        > 
            <noembed> 
              You need JRE 1.7+
            </noembed> 
          </embed> 
        </comment> 
</object>

ご覧のとおり、私はjava_argumentsタグを使用していますが、役に立たないようです。または、java_arguments が間違った方法で JVM に渡されているか、引数が無視されている可能性があります。わかりません。誰かが私を助けてその問題を解決してもらえますか? Windows7 64ビットを使用しています。前もって感謝します。

4

2 に答える 2

0

あなたが書いた:

String cont = new String(Utils.readBinaryFile(path + "/content.xml"));

String(byte[])コンストラクターは、プラットフォームの既定のエンコーディングを使用してバイトを文字に変換します。エンコーディングは何でもかまいません。最も簡単な解決策は、エンコーディングを指定できるコンストラクターを使用することです。例えば:

String cont = new String(Utils.readBinaryFile(path + "/content.xml"), "UTF-8");
于 2013-08-20T10:51:57.293 に答える
0

問題は、Utils.readBinaryFile(path + "/content.xml")おそらく UTF-8 エンコーディングを使用してファイルからデータを読み取らないことです。私の推測では、util メソッドでデフォルトのエンコーディングを使用しており、これはシステムごとに異なります。

これを修正するために必要なことは、 でファイルのエンコーディングを指定することですreadBinaryFile()

InputStreamReaderあなたの友達です。

于 2013-08-20T10:28:37.903 に答える