У меня есть небольшой Java-проект, в котором я установил свойства файлов классов в UTF-8 (я использую много посторонних символов, которых нет в CP1252 по умолчанию).
Цель - создать текстовый файл (в Windows), содержащий список элементов.
При запуске файлов классов из самого Eclipse (нажав Ctrl + F11) он без проблем создает файл и открывает его в другом редакторе (я использую Notepad ++). Я вижу символы так, как хотел.
┌──────────────────────────────────────────────────┐
│ Universidade2010 (18/18)│
│ hidden: 0│
├──────────────────────────────────────────────────┤
Но, когда я экспортирую проект (используя Eclipse) в качестве исполняемого файла Jar и запускаю его, используя 'javaw -jar project.jar', новый созданный файл представляет собой беспорядок знаков вопроса
????????????????????????????????????????????????????
? Universidade2010 (19/19)?
? hidden: 0?
????????????????????????????????????????????????????
Я следовал нескольким советам о том, как использовать UTF-8 (который, по-видимому, по умолчанию не работает в Java), чтобы попытаться исправить это, поэтому теперь я использую
Writer w = new OutputStreamWriter(fos, "UTF-8");
и запись заголовка спецификации в файл, как в этом вопросе, на который уже дан ответ , но все еще безуспешно при экспорте в Jar
Мне не хватает какого-либо свойства или команды командной строки, поэтому Java знает, что я хочу создать файлы UTF-8 по умолчанию?
проблема не в создании самого файла, потому что при разработке файл выводится корректно (с символами юникода)
Класс, который создает файл, теперь (и после предложения использовать класс Charset) выглядит так:
public class Printer {
File f;
FileOutputStream fos;
Writer w;
final byte[] utf8_bom = { (byte) 0xEF, (byte) 0xBB, (byte) 0xBF };
public Printer(String filename){
f = new File(filename);
try {
fos = new FileOutputStream(f);
w = new OutputStreamWriter(fos, Charset.forName("UTF-8"));
fos.write(utf8_bom);
} catch (FileNotFoundException e) {
} catch (IOException e) {
e.printStackTrace();
}
}
public void print(String s) {
if(fos != null){
try {
fos.write(s.getBytes());
fos.flush();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
И все используемые символы определены так:
private final char pipe = '\u2502'; /* │ */
private final char line = '\u2500'; /* ─ */
private final char pipeleft = '\u251c'; /* ├ */
private final char piperight = '\u2524'; /* ┤ */
private final char cupleft = '\u250c'; /* ┌ */
private final char cupright = '\u2510'; /* ┐ */
private final char cdownleft = '\u2514'; /* └ */
private final char cdownright = '\u2518'; /* ┘ */
Проблема остается: при выводе в файл, просто запустив проект на Eclipse, файл получается идеальным, но после развертывания проекта на Jar и запуска его в выходном файле уничтожается форматирование (я выяснил, что они заменяются символом '?')
Я пришел к выводу, что это не проблема с кодом, это проблема развертывания его в файл Jar, я думаю, что Eclipse компилирует исходные файлы в CP1252 или что-то подобное, но даже заменяет все символы Юникода их кодовые константы не помогли