2016-02-19 5 views
2

Я разработал небольшое приложение Java Swing для поиска статистики персонажей в World of Warcraft с помощью API-интерфейса разработчика, использующего Netbeans в Ubuntu Gnome 14.04. Все работает так, как я предполагал, за исключением кнопки, вызывающей метод, который открывает ссылку в браузере по умолчанию для профиля указанного символа. В Ubuntu строка, которую я использую в URL-адресе, отображается правильно, но в Windows это не так. Если я запустил приложение (в Windows) с помощью командного файла, который указывает кодировку UTF-8 для JVM, у меня нет этой проблемы. При запуске непосредственно из файла .jar символы, такие как «â» регистрируются как «Ã ¢» в URL-адресе Windows, несмотря на мою попытку кодирования всех моих строк как UTF-8. Как я могу правильно отформатировать URL? Я предполагаю, что что-то мне не хватает. Если вам нужно больше узнать о коде, дайте мне знать. Заранее спасибо.Проблема с кодировкой UTF-8 в Windows

ArmoryScanner_UI.java

private void openArmoryLink() { 

    ArmoryScanner_Backend armory = new ArmoryScanner_Backend();  
    String name; 
    String realm; 
    String locale; 

    try { 
     name = new String(jTextField_Name.getText().getBytes("UTF-8")); 

     realm = jComboBox_Realm.getSelectedItem().toString(); 
     locale = jComboBox_Locale.getSelectedItem().toString(); 

     if (!name.trim().isEmpty()) { 

      name = formatName(name); 
      realm = formatRealm(realm); 
      locale = formatLocale(locale); 

      armory.setPlayerInfo(name, realm, locale); 

      if (armory.isCharacterFound()) { 
       armory.setArmoryLink(); 
      } else { 
       showErrorMessage("Character not found."); 
       jTextField_Name.setText(""); 
       jTextField_Name.setCaretPosition(0); 
       jTextField_Name.requestFocus(); 
      } 

     } else { 
      showErrorMessage("Please enter a character name."); 
      jTextField_Name.setText(""); 
      jTextField_Name.setCaretPosition(0); 
      jTextField_Name.requestFocus(); 
     } 
    } catch (UnsupportedEncodingException e) { 
     showErrorMessage("Error converting name to UTF-8\n" 
       + e.getMessage()); 
    } 
} 

private String formatName(String name) { 

    String result; 
    try { 
     result = new String(name.getBytes("UTF-8"), "UTF-8"); 

    } catch (UnsupportedEncodingException e) { 
     showErrorMessage("Error converting name to UTF-8\n" 
       + e.getMessage()); 
     result = ""; 
    } 

    return result; 
} 

ArmoryScanner_Backend.java

public void setArmoryLink() { 

    try { 

     String baseURL = "https://us.battle.net/wow/en/character/"; 
     String fullURL = (baseURL + realm + "/" + name + "/simple"); 
     System.out.println("Full URL: " + fullURL); 

     if (Desktop.isDesktopSupported()) { 
      Desktop.getDesktop().browse(new URL(fullURL).toURI()); 
     } else { 
      Runtime runtime = Runtime.getRuntime(); 
      try { 
       runtime.exec("xdg-open " + fullURL); 
      } catch (IOException e) { 
       System.out.println("I/O exception (non-Windows system)"); 
      } 
     } 
    } catch (UnsupportedOperationException e) { 
     System.out.println("Unsupported OS"); 
    } catch (MalformedURLException e) { 
     System.out.println("Bad URL"); 
    } catch (IOException e) { 
     System.out.println("I/O exception."); 
    } catch (URISyntaxException e) { 
     System.out.println("Bad URI syntax"); 
    } 

} 

Этот метод работает отлично:

private void submit() { 

    this.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR)); 

    ArmoryScanner_Backend armory = new ArmoryScanner_Backend();  
    String name; 
    String realm; 
    String locale; 

    try { 

     name = new String(jTextField_Name.getText().getBytes("UTF-8")); 

     realm = jComboBox_Realm.getSelectedItem().toString(); 
     locale = jComboBox_Locale.getSelectedItem().toString(); 

     if (!name.trim().isEmpty()) { 

      name = formatName(name); 
      realm = formatRealm(realm); 
      locale = formatLocale(locale); 

      armory.setPlayerInfo(name, realm, locale); 

      if (armory.isCharacterFound()) { 

       setStatistics(armory); 
       setProgression(armory); 

      } else { 
       showErrorMessage("Character not found."); 
       jTextField_Name.setText(""); 
       jTextField_Name.setCaretPosition(0); 
       jTextField_Name.requestFocus(); 
      } 

     } else { 
      showErrorMessage("Please enter a character name."); 
      jTextField_Name.setText(""); 
      jTextField_Name.setCaretPosition(0); 
      jTextField_Name.requestFocus(); 
     } 

    } catch (UnsupportedEncodingException e) { 
     showErrorMessage("Error converting name to UTF-8\n" 
       + e.getMessage()); 
    } 

    this.setCursor(Cursor.getDefaultCursor()); 
} 
+0

'Ã ¢' _is_ UTF-8. Проблема в том, что все, что передается, в глиф не устанавливается в кодировку UTF-8 и пытается отобразить его, как если бы это был ASCII. –

+0

Чтобы лучше помочь, опубликуйте [MCVE] или [Short, Self Contained, Correct Example] (http://www.sscce.org/). –

+2

«url» - это единственная часть, где вам нужно использовать явную кодировку «UTF-8», и там вы этого не делаете :) 'URLEncoder.encode (stringToBeEncoded,« UTF-8 »)' – RobAu

ответ

0

Java использует Unicode на внутренней стороне, так что вы обычно не нужны для установки кодировки EXCEPT при чтении/записи внешних ресурсов.

Там вы должны иметь это явно.

В вашем случае вам нужно закодировать элементы URL с классом URLEncoder.

Посмотрите на the documentation.

+0

Это не могло быть работал более совершенным образом. Большое спасибо. – Mithrandir1210