Теперь уже в этой теме прошу писать всех, кто хотел бы что-то обсудить – статьи на сайте или же просто какие-то интересные/актуальные вопросы. По результатам сбора пожеланий опять-таки будут созданы темы для обсуждения. Или же статьи, что тоже реально.
Я был бы рад, если бы анонимные комментарии и вопросы были подписаны – проще отвечать.
Comments
1. Как Вы посылаете строку с русскими буквами? Она прошита в коде? В какой кодировке исходник? Совпадает ли она с кодировкой операционки по умолчанию?
2. Вы просто выводите в клиенте полученную обратно строку в консоль? Не пробовали сохранять ее в файл с явным указанием кодировки?
Спасибо за ответ.
1.Строка на русском прошита в коде (Клиента). С кодировкой по умолчанию не совпадает -(DE).Думаю кодировка Ср1252 - отображает корректно нем-ие умляуты.Русский "подключен".
2. Вывожу строку обратно на консоль. Пробовал изменить метод в Бине чтобы принимал String str а возвращал byte[] в заданной кодировке - результат: могу получить "кракозяблы".
Пробовал формировать String в Клиенте: new String(str_ru.getBytes("Cp1252"), "Cp1251") отправлять его в метод Бина получать обратно и выводить на консоль, результат: ??????.
В файл сохранять не пробовал - хотел получить на консоле.
Чего-то я недопонимаю...
Значит, так. EJB устроен таким образом, что проблем с кодировкой быть не может. При передаче данных работает стандартная сериализация, так что строка будет передана в бин точно так, как она была создана. И назад вернется в том же виде. Так что - или ввод или вывод.
Я предполагаю, что проблема на стадии компиляции. Попробуйте сохранить строку в файл до ее передачи на сервер:
С большой вероятностью уже тут будут "кракозябры". Если так - надо компилятору указать, в какой кодировке файл. Опция -encoding .... Ну или в NetBeans задать, я с ним не работал давно, не скажу, как это делается.
В общем, попробуйте сначала так.
Так, до меня только сейчас дошло. У Вас одновременно отображаются и умляуты и русские буквы? Если да - это НЕ 1252. 1252 с 1251 пересекаются именно в области диакретических символов, отображаться будут или одни, или другие. Сравните картинки: 1251 и 1252. Если одновременно отображаются и те, и другие - с большой вероятностью это какой-то UTF. В общем, если Вы выложите файл и расскажите, как Вы его компилируете - будет проще искать.
сохранил строку, в которой используются русские и немецкие буквы, до отправки на сервер в файл: В файле отображаются все знаки правильно(и кириллица и умляуты) т.е. кодировка "UTF-8".
В NetBeans созданы два проекта: Bean и Клиент. У обоих в свойствах установлено Encoding "UTF-8".
Одновременно (при запуске проекта) правильно отображаются латиница и нем. умляуты. Вместо русских букв - ????? или "кракозяблы"
Ниже привожу код и результаты:
Bean:
package ejb;
@Stateless(mappedName="RuEJB")
public class RuBean implements RuRemote {
public byte[] getResult(String str, String charSet){
return str.getBytes(charSet);
}
}
Client:
package ruejbclient;
public class Main {
public static void main(String[] args){
String str_en = "EJB im Einsatz!!!";
String str_de = "DE: Überprüfung";
String str_ru = "RU: Шпора Überweisung";
String str_ru2 = new String(str_ru.getBytes("Cp1252"), "Cp1251");
//--------------------------------------
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("string.txt"), "UTF-8"));
writer.write(str_ru);
writer.flush();
writer.close();
//--------------------------------------
InitialContext ctx = new InitialContext();
RuRemote rb = (RuRemote) ctx.lookup("RuEJB");
//------------OUTPUT--------------------
System.out.println("Main() sagt_en: " + new String(rb.getResult(str_en, "Cp1252")));
System.out.println("Main() sagt_de: " + new String(rb.getResult(str_de, "Cp1252")));
System.out.println("Main() sagt_ru: " + new String(rb.getResult(str_ru, "Cp1251")));
System.out.println("Main() sagt_ru2: " + new String(rb.getResult(str_ru2, "Cp1251")));
}
Output
string.txt:
RU: Шпора Überweisung
//--------------------------------------
Consol:
run-tool:
Main() sagt_en: EJB im Einsatz!!!
Main() sagt_de: DE: Überprüfung
Main() sagt_ru: RU: <кракозяблы> ?berweisung
Main() sagt_ru2: RU: ????? Überweisung
BTW, я не уверен, что Вы в консоль вообще сможете вывести одновременно русские и немецкие символы. Я недавно минут 15 потратил на запуск консоли Windows в Unicode. Как-то результата не добился, как была Cp866, так и осталась.
P.S. Создавать строку из байтов без указания кодировки - некошерно. Правильно так:
new String(rb.getResult(str_de, "Cp1252"),"Cp1252")