Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Кодировки для ResourceBundle / 6 сообщений из 6, страница 1 из 1
31.01.2007, 18:47:10
    #34297387
maxq
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кодировки для ResourceBundle
Есть 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
31.01.2007, 19:07:47
    #34297430
Leonidv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кодировки для ResourceBundle
Не до конца уверен, но возможно это поможет:
http://www.rsdn.ru/Forum/Message.aspx?mid=2313619&only=1
...
Рейтинг: 0 / 0
31.01.2007, 19:22:00
    #34297448
maxq
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кодировки для ResourceBundle
LeonidvНе до конца уверен, но возможно это поможет:
http://www.rsdn.ru/Forum/Message.aspx?mid=2313619&only=1

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

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

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

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

Читайте доки
...
Рейтинг: 0 / 0
02.02.2007, 14:30:47
    #34302436
maxq
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Кодировки для ResourceBundle
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
Форумы / Java [игнор отключен] [закрыт для гостей] / Кодировки для ResourceBundle / 6 сообщений из 6, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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