powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Кодировки для ResourceBundle
6 сообщений из 6, страница 1 из 1
Кодировки для ResourceBundle
    #34297387
maxq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть property файл ApplicationMessages.properties
Код: plaintext
1.
user.description=Mit einem Sternchen markierte Felder sind Pflichtfelder und müssen ausgefüllt werden { 0 } { 1 }.
key=value
Нужно на его основе создать другой property файл ApplicationMessagesTest.properties
где key=key #value (#value - коментируем значение) Это всю нужно для тестирования приложения, так сразу видно какие проперти еще не переведины.
Аналогичная проблема возникает и при импорте этих пропертей с их хначениями в базу

Есть класс, который это реализует ParsePropertyFile
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
 public   class  ParsePropertyFile {
     private   static   final   int  PARAM_ERROR = - 1 ;
     private   static   final  String FILE_PATH = "resources/";
    
    /**
     * Get list of params for string
     * @param str
     * @param key
     * @return Collection
     */
     private   static  Collection getParams(String str, String key) {
        Collection list =  new  ArrayList();
         int  index =  0 ;
         int  openBracket =  0 ;
         int  closeBracket =  0 ;

         int  amount = amountOfParameters(str, key);
         if (amount != PARAM_ERROR && amount >  0 ) {
             for ( int  i =  0 ; i < amount; i++) {
                openBracket = str.indexOf("{", index);
                closeBracket = str.indexOf("}", index);
                index = closeBracket + 1 ;
                list.add(str.substring(openBracket, closeBracket +  1 ));
            }
        }
         return  list;
    }

    /**
     * Return amount of parameters
     * @param str
     * @param key
     * @return int
     */
     private   static   int  amountOfParameters(String str, String key) {
         int  amount =  0 ;
         int  stack =  0 ;
        String symbol = "";

         for ( int  i =  0 ; i < str.length(); i++) {
            symbol = str.substring(i, i+ 1 );

             if (symbol.equals("}")) {
                stack--;
            }
             if (symbol.equals("{")) {
                stack++;
                amount++;
            }
        }

         if (stack !=  0 ) {
            System.err.println("Wrong some of value parameters for key: " + key);
             return  PARAM_ERROR;
        }
         else  {
             return  amount;
        }
    }

     public   static   void  main(String[] args) {
        Collection params;
        String output;
        OutputStream file;                                                                                        
        String pathInputFile;
        String pathOutputFile;

         try  {
            /* todo: For console entering
            BufferedReader br;
            System.out.print("Enter path input file: ");
            br = new BufferedReader(new InputStreamReader(System.in));
            pathInputFile = br.readLine();
            System.out.print("Enter path output file: ");
            br = new BufferedReader(new InputStreamReader(System.in));
            pathOutputFile = br.readLine();
            */

            // todo: For constant entering
            pathInputFile  = FILE_PATH + "ApplicationMessages.properties";
            pathOutputFile = FILE_PATH + "ApplicationMessagesTest.properties";

            // output file
            file =  new  FileOutputStream(pathOutputFile);
            // input file
            ResourceBundle myResources =  new  PropertyResourceBundle( new  FileInputStream(pathInputFile));
            Enumeration e = myResources.getKeys();
             while  (e.hasMoreElements()) {
                String key = (String) e.nextElement();
                String value = myResources.getString(key);

                output = key + "=" + key;
                params = getParams(value, key);
                 if  (!params.isEmpty()) {
                    Iterator iter = params.iterator();
                     while  (iter.hasNext()) {
                        output = output + " " + iter.next();
                    }
                }
               
                // write to file
                String str =  new  String(myResources.getString(key).getBytes("ISO-8859-1"),"UTF-8");
                file.write(("#" + str + "\n").getBytes());
                file.write((output + "\n").getBytes());
            }
            file.close();
        }
         catch  (FileNotFoundException e) {
            System.err.println("File not found:" + "\n" + e.getMessage());
            e.printStackTrace();
        }
         catch  (IOException e) {
            System.err.println(e.getMessage());
            e.printStackTrace();
        }
    }
}

Результирующий файл ApplicationMessagesTest.properties
Код: plaintext
1.
2.
#Mit einem Sternchen markierte Felder sind Pflichtfelder und m?ssen ausgef?llt werden { 0 } { 1 }.
user.description=user.description { 0 } { 1 }

Рузультат правильный но КОДИРОВКА , появились символы "?", так как язик немецкий.
Как мне от них избавиться и получить правильную кодировку.
Нашел в одной статьи статьи как это сделать : new String(myResources.getString(key).getBytes("ISO-8859-1"),"UTF-8"); , но у меня не сработало.

Может, кто знает как разрулить эту проблему???
...
Рейтинг: 0 / 0
Кодировки для ResourceBundle
    #34297430
Leonidv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не до конца уверен, но возможно это поможет:
http://www.rsdn.ru/Forum/Message.aspx?mid=2313619&only=1
...
Рейтинг: 0 / 0
Кодировки для ResourceBundle
    #34297448
maxq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
LeonidvНе до конца уверен, но возможно это поможет:
http://www.rsdn.ru/Forum/Message.aspx?mid=2313619&only=1

Так то оно будет работать, но суть в том, что значение этих пропертей будут менять люди которые не программисты и которые не умеют пользоваться утилитой native2ascii.exe , которые могут ввести только текст.

Поэтому нужно как то выкручиваться. Осталось придумать как?
Уверен ответ очень простой, какаето мелочь...
...
Рейтинг: 0 / 0
Кодировки для ResourceBundle
    #34297587
Leonidv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Думаю, самый простой вариант - написать мелкую программку для их редактирования. Или найти уже готовую.
...
Рейтинг: 0 / 0
Кодировки для ResourceBundle
    #34297620
max_from_sumy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Похоже ваша проблема в том, что , когда вы создаете PropertyResourceBundle из потока

Код: plaintext
ResourceBundle myResources =  new  PropertyResourceBundle( new  FileInputStream(pathInputFile));

в него уже читаются символы в кодировке ISO-8859-1 и здесь уже потеряна информация о символах, которые в этой кодировке не представимы. Это кстати написано в той статье, что вы привели. Вам нельзя использовать ResourceBundle API для перекодировки символов, скорее свего придется ручками распарсивать файл и перекодировать.

Читайте доки
...
Рейтинг: 0 / 0
Кодировки для ResourceBundle
    #34302436
maxq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
max_from_sumyПохоже ваша проблема в том, что , когда вы создаете PropertyResourceBundle из потока

Код: plaintext
ResourceBundle myResources =  new  PropertyResourceBundle( new  FileInputStream(pathInputFile));

в него уже читаются символы в кодировке ISO-8859-1 и здесь уже потеряна информация о символах, которые в этой кодировке не представимы. Это кстати написано в той статье, что вы привели. Вам нельзя использовать ResourceBundle API для перекодировки символов, скорее свего придется ручками распарсивать файл и перекодировать.

Читайте доки

Ты прав на счет: " в него уже читаются символы в кодировке ISO-8859-1 и здесь уже потеряна информация о символах ",
НО если мы сохраним файл в кодировке UTF-8 , любым редактором, и сдесь не нужно пользоваться програмой native2ascii.exe , то все замечательно работает, и любой пользователь сможет менят текст, не задумываясь ни о каких кодировках!

Осталось только в коде изменить одну строку: file.write(("#" + str + "\n").getBytes("UTF-8"));
Код: plaintext
1.
2.
3.
String str =  new  String(value.getBytes("ISO-8859-1"), "UTF-8");
file.write(("#" + str + "\n").getBytes("UTF-8"));
file.write((output + "\n").getBytes());

Чтоб записать даные в результирующий файл с правильной кодировкой!
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Кодировки для ResourceBundle
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]