?

Log in

Previous Entry

Теперь уже в этой теме прошу писать всех, кто хотел бы что-то обсудить – статьи на сайте или же просто какие-то интересные/актуальные вопросы. По результатам сбора пожеланий опять-таки будут созданы темы для обсуждения. Или же статьи, что тоже реально.

Я был бы рад, если бы анонимные комментарии и вопросы были подписаны – проще отвечать.

Comments

skipy_ru
May. 16th, 2010 04:13 pm (UTC)
Re: EJB3
Ну... Вопросов два.

1. Как Вы посылаете строку с русскими буквами? Она прошита в коде? В какой кодировке исходник? Совпадает ли она с кодировкой операционки по умолчанию?

2. Вы просто выводите в клиенте полученную обратно строку в консоль? Не пробовали сохранять ее в файл с явным указанием кодировки?
(Anonymous)
May. 20th, 2010 11:22 pm (UTC)
Re: EJB3
Добрый вечер Евгений.
Спасибо за ответ.
1.Строка на русском прошита в коде (Клиента). С кодировкой по умолчанию не совпадает -(DE).Думаю кодировка Ср1252 - отображает корректно нем-ие умляуты.Русский "подключен".
2. Вывожу строку обратно на консоль. Пробовал изменить метод в Бине чтобы принимал String str а возвращал byte[] в заданной кодировке - результат: могу получить "кракозяблы".
Пробовал формировать String в Клиенте: new String(str_ru.getBytes("Cp1252"), "Cp1251") отправлять его в метод Бина получать обратно и выводить на консоль, результат: ??????.
В файл сохранять не пробовал - хотел получить на консоле.
Чего-то я недопонимаю...
skipy_ru
May. 21st, 2010 06:55 am (UTC)
Re: EJB3
Ну, в принципе ясно.

Значит, так. EJB устроен таким образом, что проблем с кодировкой быть не может. При передаче данных работает стандартная сериализация, так что строка будет передана в бин точно так, как она была создана. И назад вернется в том же виде. Так что - или ввод или вывод.

Я предполагаю, что проблема на стадии компиляции. Попробуйте сохранить строку в файл до ее передачи на сервер:

BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("string.txt"), "UTF-8"));
writer.write(str);
writer.flush();
writer.close();


С большой вероятностью уже тут будут "кракозябры". Если так - надо компилятору указать, в какой кодировке файл. Опция -encoding .... Ну или в NetBeans задать, я с ним не работал давно, не скажу, как это делается.

В общем, попробуйте сначала так.

Так, до меня только сейчас дошло. У Вас одновременно отображаются и умляуты и русские буквы? Если да - это НЕ 1252. 1252 с 1251 пересекаются именно в области диакретических символов, отображаться будут или одни, или другие. Сравните картинки: 1251 и 1252. Если одновременно отображаются и те, и другие - с большой вероятностью это какой-то UTF. В общем, если Вы выложите файл и расскажите, как Вы его компилируете - будет проще искать.
(Anonymous)
May. 31st, 2010 09:27 pm (UTC)
Re: EJB3
Евгений,
сохранил строку, в которой используются русские и немецкие буквы, до отправки на сервер в файл: В файле отображаются все знаки правильно(и кириллица и умляуты) т.е. кодировка "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


skipy_ru
Jun. 1st, 2010 07:28 am (UTC)
Re: EJB3
Ну, как я и предполагал. У Вас с консолью проблемы. В секции OUTPUT вместо консоли первые три ответа сервера выведите в файл, так же, как выше. В кодировке UTF-8. И посмотрите, что и как, должно быть все нормально.

BTW, я не уверен, что Вы в консоль вообще сможете вывести одновременно русские и немецкие символы. Я недавно минут 15 потратил на запуск консоли Windows в Unicode. Как-то результата не добился, как была Cp866, так и осталась.

P.S. Создавать строку из байтов без указания кодировки - некошерно. Правильно так: new String(rb.getResult(str_de, "Cp1252"),"Cp1252")