Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Имя файла в UTF-8, Необходимо сохранить файл чьё имя в UTF 
V
    Опции темы
VAngeL86
Дата 28.6.2010, 16:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 71
Регистрация: 29.4.2006
Где: Хабаровск

Репутация: 1
Всего: 1



Доброго всем времени суток!
Столкнулся со следующей проблемой. Необходимо сохранять файл, чьё имя может быть на различных языках и следовательно содержит символы из Unicode (например günstig [нем.]). В Linux никаких проблем с этим нет.
Следующий код прекрасно работает на Linux, но в Windows вместо символа "ü" белеберда. 
Код

public class FileTest {
    public static void main(String[] args) throws Exception {
        BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(
                        new FileOutputStream("günstig.txt"), Charset.forName("UTF-8")));
        try {
                   writer.write("Its some text with günstig word");
                   writer.flush();
                   writer.close();
                
               System.out.println("File was successfully saved.");
        } finally {
            try {
                writer.close();
            } catch (Exception ioEx) {
                System.err.println("Error while closing writer");
            }
        }
    }
}

Выяснил, что если заменить символ "ü" его кодом "\u00FC", то никаких проблем нет. Однако данный вариант не для реалтайма (или я ошибаюсь?). Сам файл с исходным кодом в UTF-8. 
Подскажите, может кто сталкивался с данной проблемой.

Заранее спасибо!
PM MAIL ICQ   Вверх
VAngeL86
Дата 28.6.2010, 19:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 71
Регистрация: 29.4.2006
Где: Хабаровск

Репутация: 1
Всего: 1



Эх... видимо не простая задача)) 
Решил извращённым способом, но работает.

Имя файла преобразуется в "кодовое представление", вбивается в шаблон кода по созданию файла, который далее компилется и выполняется)). В итоге файл с именем в юникоде)). 
Если кто то знает способ проще, буду только рад услышать)) А пока, кому интересно привожу свой код:  smile 
Код

import org.codehaus.janino.ClassBodyEvaluator;

/**
 *
 * @author vangel
 */

public class FileUtils {

    private static final String FILE_CREATION_CODE_TEMPLATE =
              "import java.io.File; "
            + "import java.io.IOException; "
            + "private static final String FILE_NAME = \"__FILE_NAME__\"; "
            + "public static void createFile() throws IOException { "
            +    "new File(FILE_NAME).createNewFile(); "
            + "}";

    public static void createUnicodeNamedFile(String folderPath, String fileName) throws Exception {
        String fileCreationCode = FILE_CREATION_CODE_TEMPLATE
                .replace("__FILE_NAME__", folderPath+"/"+stringToCodes(fileName));

        Class c = new ClassBodyEvaluator(fileCreationCode).getClazz();
        c.getDeclaredMethod("createFile").invoke(null);
    }

    private static String stringToCodes(String value) {
        StringBuilder buffer = new StringBuilder();
        for (int i=0; i<value.length(); i++) {
            buffer.append("\\u")
                  .append(intToHex(value.charAt(i)));
        }

        return buffer.toString();
    }

    private static String intToHex(int value) {
        StringBuilder buffer = new StringBuilder(Integer.toHexString(value));

        int leadZeroNum = 4 - buffer.length();
        for (int i=0; i<leadZeroNum; i++) {
            buffer.insert(0, "0");
        }

        return buffer.toString();
    }

    public static void main(String[] args) throws Exception {
        createUnicodeNamedFile("/tmp", "günstig");
    }
}


Для компиляции/работы данного кода потребуется библиотека JANINO 
PM MAIL ICQ   Вверх
Dummy
Дата 29.6.2010, 18:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 263
Регистрация: 21.5.2007

Репутация: 9
Всего: 19



Цитата(VAngeL86 @  28.6.2010,  16:18 Найти цитируемый пост)
Выяснил, что если заменить символ "ü" его кодом "\u00FC", то никаких проблем нет. Однако данный вариант не для реалтайма (или я ошибаюсь?).

Что значит "не для реалтайма"? Последовательность \u00FC в строке заменится на двухбайтный символ в константном пуле (именно то, что надо). Такая форма записи будет одинаково компилироваться при любой кодировке исходников. Так что если по какой-то причине надо хардкодить имя файла, этот способ кажется наиболее подходящим.

Это сообщение отредактировал(а) Dummy - 29.6.2010, 18:00
PM MAIL   Вверх
VAngeL86
Дата 29.6.2010, 18:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 71
Регистрация: 29.4.2006
Где: Хабаровск

Репутация: 1
Всего: 1



Цитата(Dummy @  29.6.2010,  18:00 Найти цитируемый пост)
Что значит "не для реалтайма"?

Это значит, что если я имя файла получаю во время работы программы (по сокету, на мыло, читаю из файла и т.п.), то "захардкодить" не получится. 
Исходник у меня в UTF-8. Проверено. Даже код писал на Линуксе, а jar запускал на Винде. 1 вариант кода, что я привёл НЕ РАБОТАЕТ под Виндой. Потому и пришлось использовать не очень приятный (лично мне) 2 вариант кода. Я практически уверен, что есть другой способ. Но не нашёл его). Нужен был результат как можно быстрее - я его получил. Но любопытство всё равно осталось)) 
PM MAIL ICQ   Вверх
Dummy
Дата 29.6.2010, 19:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 263
Регистрация: 21.5.2007

Репутация: 9
Всего: 19



А параметр -encoding utf8 при компиляции указывали?
PM MAIL   Вверх
VAngeL86
Дата 29.6.2010, 19:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 71
Регистрация: 29.4.2006
Где: Хабаровск

Репутация: 1
Всего: 1



Цитата(Dummy @  29.6.2010,  19:22 Найти цитируемый пост)
А параметр -encoding utf8 при компиляции указывали? 

я знал, что всё просто))) Спасибо!

P.S. Хм... действительно вполне логично было попробовать явно указать компилятору кодировку исходников .... но был аврал)) 

Это сообщение отредактировал(а) VAngeL86 - 29.6.2010, 19:37
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0869 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.