2016-12-30 10 views
0

Я пытаюсь читать арабские и персидские ключи & значения из файла java вместо файла свойств с ResourceBundle, но он отображает неизвестные символы.Как читать арабский или персидский (ключ и значения) из java-файла с ResourceBundle

То, что я сделал, что я Кодовый 3 файлов, как: 1. LabelsBundle_en_US.java 2. LabelsBundle_ar_AE.java 3. LabelsBundle_fa_IR.java

Мой файл LabelsBundle_en_US.java выглядит следующим образом:

public class LabelsBundle_en_US extends ListResourceBundle{ 
      static final Object[][] contents = { 
               {"REGISTER","Registration Form"}, 
               {"USERNAME","Email"}, 
               {"PASSWORD","Password"}, 
               {"CONFIRM_PASS","Confirm Password"}, 
               {"SUBMIT","Register"} 
               }; 

      protected Object[][] getContents(){ 
      return contents; 
      } 
    }//class 

Мой файл LabelsBundle_fa_IR.java выглядит следующим образом:

public class LabelsBundle_fa_IR extends ListResourceBundle{ 
     static final Object[][] contents = { 
              {"REGISTER","ثبت نام"}, 
              {"USERNAME","ایمیل"}, 
              {"PASSWORD","رمز"}, 
              {"CONFIRM_PASS","مرور رمز"}, 
              {"SUBMIT","ارسال"} 
              }; 

     protected Object[][] getContents(){ 
     return contents; 
     } 
}//class 

Вот мой сервлет:

protected void doGet(HttpServletRequest req, HttpServletResponse res)throws ServletException, IOException{  
     res.setContentType("text/html; charset=UTF-8"); 
     req.setCharacterEncoding("UTF-8"); 
     res.setCharacterEncoding("UTF-8");  
     StringWriter sWriter = new StringWriter(); 
     PrintWriter out   = new PrintWriter(sWriter);   

     String country   = req.getParameter("country"); 
     String language   = req.getParameter("language"); 
     Locale locale=null; 
     if(country == null){ 
      locale = new Locale("en","US"); 
     } 
     else{ 
      locale = new Locale(language, country); 
     }  
     ResourceBundle rb = ResourceBundle.getBundle("com.i18n.resource.bundles.LabelsBundle",locale); 
     req.setAttribute("resource", rb); 

     out.println("<?xml version=\"1.0\" encoding=\"UTF-8\"?>"+ 
        "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.1//EN\" \"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd\">"+ 
        "<html xmlns=\"http://www.w3.org/1999/xhtml\" xml:lang=\"fi\" dir=\"auto\">"+ 
        "<head>"+ 
        "<meta http-equiv='Content-Type' content='text/html; charset=UTF-8' />"+ 
        "<body>"+ 
        "<center><h1>"+rb.getString("REGISTER")+"</h1></center>"+ 
        "<table border=0 width=540 align=center>"+ 
         "<tr><td colspan=2 align=center><h1>"+rb.getString("REGISTER")+"</h1></td></tr>"+ 
         "<tr><td>"+rb.getString("USERNAME")+"</td><td><input type=text name=username></td></tr>"+ 
         "<tr><td>"+rb.getString("PASSWORD")+"</td><td><input type=password name=password></td></tr>"+ 
         "<tr><td>"+rb.getString("CONFIRM_PASS")+"</td><td><input type=password name=cPass></td></tr>"+ 
         "<tr><td colspan=2 align=center><input type=submit value="+rb.getString("SUBMIT")+"></td></tr>"+ 
        "</table></html>"); 
     res.getWriter().print(sWriter.toString()); 
    }//doGet 

Этот код (ы) работают хорошо, когда язык en_US, но когда я изменить его на арабский или персидский, то его отображения как:

ط«ط¨طھ ظ†ط§ظ… 

ط§غ Œ ظ ... غ Œ ظ «
ط ± ظ ... ط²
ظ ... ط ± ظط ± ط ± ظ ... ط² ط§ط ± ط³ط§ظ «

Пожалуйста посоветуйте

ответ

0

Лично я не вижу веских оснований использовать ListResourceBundle для строк. Но эй, что угодно ...

Проблема здесь в кодировке исходного файла .java.

Вы можете кодировать файл как utf-8, но компилятор Java этого не знает и использует системную кодировку.

a. Вы можете передать требуемую кодировку в компилятор с помощью -encoding:

javac -encoding utf-8 LabelsBundle_fa_IR.java 

b. Вы можете Unicode-escape строки, делающие файл ASCII. Эти символы будут нечитаемыми (будет «... \ u0646 ...»), но нет никакой путаницы для компилятора больше:

native2ascii -encoding utf-8 LabelsBundle_fa_IR.java asciifile 
rename asciifile LabelsBundle_fa_IR.java 

Я предполагаю, что вы не посылать файл .java для локализации :-) Большинство инструментов локализации извлекают из файла локализуемые материалы, переводят и генерируют Java. Часто есть возможность генерировать его с помощью unicode-escape, поэтому нет необходимости проходить весь путь до .java и конвертировать туда.

===

Это плохой ответ:

rb.getString("USERNAME").getBytes(), "UTF-8"); 

GetBytes зависит от кодировки системы, но это кодирование во время выполнения.

Таким образом, это кодирование вашего сервера, а также тот, который использовался для компиляции ваших Java-файлов. Это может быть иначе.

===

Почему я предпочитаю .properties в ListResourceBundle:

  • локализации (переводчики, а не технари) не происходит на .java файлов. Строки необходимо извлечь и положить обратно. Так как файл .java может содержать код, а что нет, в этом процессе легче повредить. Большинство инструментов локализации обрабатывать .properties хорошо, но не ListResourceBundle

  • кодирования файла .properties хорошо определен: Latin 1. Там нет «магии» и не зависит от системы. Значит, вам не нужны специальные флаги во время компиляции.

  • ListResourceBundle хорош для локальных объектов. Подумайте, бизнес-логика, например, правила налогового законодательства, или специальные рабочие процессы. Вот почему это карта из String в Object. Вы можете, конечно, поместить строки там, но .properties или .xml были , специально предназначенные для строк.

+0

Ваше решение отлично подходит для файлов ListResourceBundle. Как вы посоветовали, я использовал файлы свойств и снова столкнулся с той же проблемой. Арабский и персидский не отображаются точно, но странные знаки с пакетом пакетов Java-пакетов – Ghayel

+0

Ответ: «кодировка файла .properties определена: Latin 1». Поэтому, если вы ставите UTF-8, работа не работает. Вам нужно использовать native2ascii и преобразовать его в скрытую форму. Да, это неуклюже, но это стандартный, официальный способ сделать это. Это более надежно, чем в Java-источниках. Похоже, что UTF-8 .properties (наконец!) Запланировано для Java 9. –

+0

'str = new String (rb.getString (ключ) .getBytes (« ISO-8859-1 »),« UTF-8 »); 'решена моя проблема – Ghayel

0
String USERNAME = new String(rb.getString("USERNAME").getBytes(), "UTF-8");  

 Смежные вопросы

  • Нет связанных вопросов^_^