0

すべての構成を処理する 3 つのクラスがあります。(2クラス2000回線)

そして、すべてのコードを 0 から記述せずに、UTF-8 文字のサポートを追加したい ;/

私は最小のクラスを示しています (まだ完成していないので、1400 行でスパムを送信したくありません :)) 実際には 2 つの変数しかありません。

package com.gmail.bukkitSmerf.professionalWarns;

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;

import org.bukkit.configuration.InvalidConfigurationException;
import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.configuration.file.YamlConfiguration;

public class LangHandler {
    private static String lWarns_DeletedWarnAddon, lWarns_ExpiredWarnAddon;

    public static String getlWarns_DeletedWarnAddon() {
        return lWarns_DeletedWarnAddon;
    }

    public static String getlWarns_ExpiredWarnAddon() {
        return lWarns_ExpiredWarnAddon;
    }

    public void createConfig(boolean forceConfigUpdate) {
        try {
            String langFileName = "languageEN.yml";
            InputStream input = ProfessionalWarns
                    .getPluginResource_languageEN();
            if (ConfigHandler.getcGeneral_Language().equalsIgnoreCase("PL")) {
                langFileName = "languagePL.yml";
                input = ProfessionalWarns.getPluginResource_languagePL();
            }
            File langFile = new File(ProfessionalWarns.getPluginDataFolder(),
                    langFileName);
            if (!langFile.exists()) {
                langFile.getParentFile().mkdirs();
                ConfigHandler.copy(input, langFile);
            }
            YamlConfiguration lang = new YamlConfiguration();
            FileConfiguration rawLang = YamlConfiguration
                    .loadConfiguration(input);
            lang.load(langFile);

            lWarns_DeletedWarnAddon = lang.getString("Warns.DeletedWarnAddon",
                    rawLang.getString("Warns.DeletedWarnAddon"));

            lWarns_ExpiredWarnAddon = lang.getString("Warns.ExpiredWarnAddon",
                    rawLang.getString("Warns.ExpiredWarnAddon"));

            if (ConfigHandler.iscGeneral_AutoUpdateConfigs()
                    || forceConfigUpdate) {
                FileWriter fw = new FileWriter(langFile);
                PrintWriter pw = new PrintWriter(fw);
                pw.flush();
                pw.write("Warns:\n  DeletedWarnAddon: '"
                        + lWarns_DeletedWarnAddon + "'\n  ExpiredWarnAddon: '"
                        + lWarns_ExpiredWarnAddon + "'");
                pw.close();
            }
        } catch (IOException | InvalidConfigurationException e) {
            e.printStackTrace();
            ProfessionalWarns
                    .logWarning("Error when trying create/write/reload language file!");
        }
    }
}

ここでその UTF-8 を使用する方法がわかりません。

また、機能を削除したくありません。

できれば、そのコードに関するアドバイスも教えてください:)

//私の英語でごめんなさい

4

1 に答える 1

0

あなたのコメントに基づいて、私はあなたの使用を非難するつもりですFileWriter

FileWriter fw = new FileWriter(langFile);

これは、インストールのデフォルトのエンコーディングに依存していますが、UTF-8 ではないことは間違いありません。これは、次の方法で確認できます。

System.out.println(Charset.defaultCharset());

いずれにせよ、UTF-8 文字をファイルに書き込む正しい方法は、次を使用することOutputStreamWriterです。

FileOutputStream fos = new FileOutputStream("your_file");
OutputStreamWriter osw = new OutputStreamWriter(fos, "UTF-8");
PrintWriter pw = new PrintWriter(osw);

これが 1 回限りのコードでない限りFileOutputStreamfinallyブロック内で閉じる必要があります。

于 2013-07-11T20:46:58.800 に答える