Обычная версия
Java форум JavaTalks
форум программистов

Поиск   Пользователи   Группы   Регистрация 
 Профиль   Личные сообщения 

 Вход 

Кодировка в Java
Список форумов
 ->  Локализация (l10n & i18n)


На страницу 1, 2  След. 
Начать новую тему 
Предыдущая тема :: Следующая тема  
Автор Сообщение
Spruce : 5
Новичок

СообщениеИюл 30, 2010 12:04 
Ответить с цитатой
Добрый день.
Столкнулся с проблемой кодировки c поддрежкой кирилицы.
Приложение на Java написано как клиентский интерфейс управления(win,linux,macos) для службы на сервере(с++)(linux).

Java клиент общается с сервером по сокету. Данные с сервера могу отправлять в любой кодировке (UTF-8, KOI8-R, CP1251...), но когда я принимаю на клиентской стороне их, никакая из кодировок не подходит.

Какую кодировку использовать, чтобы Java могла нормально понимать кирилицу?

Спасибо.
К началу Посмотреть профиль Отправить личное сообщение
Skipy : 4801
Я тут живу!
Откуда: Москва, Россия

СообщениеИюл 30, 2010 12:42 
Ответить с цитатой
Java поддерживает и UTF-8, и Cp1251, и koi-8. Тут уже зависит от того, как Вы получаете байты и как переводите в символы. Можете привести последовательность байтов с русским текстом, которая приходит с сервера?

Почитайте еще вот это: http://www.skipy.ru/technics/encodings.html
_________________
С уважением,
Евгений aka Skipy
www.skipy.ru
P.S. Я НЕ решаю задачи ЗА других!
К началу Посмотреть профиль Отправить личное сообщение Посетить сайт автора
Spruce : 5
Новичок

СообщениеИюл 30, 2010 13:28 
Ответить с цитатой
Ну последовательность обычная. Если я правильно понял ваш пост, то данные представляют из себя просто русский текст. В моем случае это названия чего-либо и различные комметарии на русском языке.

На сервере отправляю текст строкой, на клиенте принимаю через readline() и получаю собственно строчку типа String. Дальше ее записываю в TableModel для вывода в таблицу.
Если же данные в таблицу ввожу из формы самого клиента, то там нормально по русски добавляется.
К началу Посмотреть профиль Отправить личное сообщение
Skipy : 4801
Я тут живу!
Откуда: Москва, Россия

СообщениеИюл 30, 2010 17:46 
Ответить с цитатой
Spruce писал(а):
На сервере отправляю текст строкой, на клиенте принимаю через readline() и получаю собственно строчку типа String.


Это слишком общее описание. Я потому и просил привести последовательность, и код, который ее читает, что тут можно очень легко ошибиться. Хотя бы 10 байт приведите, плюс код, который их читает и преобразует в строку.
_________________
С уважением,
Евгений aka Skipy
www.skipy.ru
P.S. Я НЕ решаю задачи ЗА других!
К началу Посмотреть профиль Отправить личное сообщение Посетить сайт автора
Spruce : 5
Новичок

СообщениеИюл 30, 2010 17:56 
Ответить с цитатой
Вот кусок чтения из сокета и внесения данных в таблицу:
Код:

String strGet="";
is = new DataInputStream(socket.getInputStream());

while ((strGet = is.readLine()) != null) {
   if (strGet.indexOf("END_TABLE") != -1) break;

   arrStrings[jTbl] = strGet;
   jTbl++;
   
   if (jTbl == jTblN) {
      myModel.addRow(arrStrings);
      jTbl = 0;
      iTbl++;
   }
}




Упрощенно последовательность передачи выглядит так:
SEND_TABLE\n
Наименование1\n
Параметр11\n
Параметр12\n
Параметр13\n
Наименование2\n
Параметр21\n
Параметр22\n
Параметр23\n
END_TABLE\n
К началу Посмотреть профиль Отправить личное сообщение
DronidZe : 14
Новичок

СообщениеСен 16, 2010 10:14 
Ответить с цитатой
Попробуй отсылать на сервере строки в UTF-8 кодировке, а на клиенте читать
is.readUTF()
где is экземпляр DataInputStream
К началу Посмотреть профиль Отправить личное сообщение
Spruce : 5
Новичок

СообщениеСен 16, 2010 10:16 
Ответить с цитатой
Спасибо, с проблемой уже разобрался, если интересно, могу кинуть кусок кодаSmile
К началу Посмотреть профиль Отправить личное сообщение
matvey : 33
Новичок
Откуда: Novosibirsk

СообщениеНоя 24, 2010 7:14 
Ответить с цитатой
Дабы не создавать новую тему, cпрошу здесь. Тоже проблема с кодировкой.

Та же проблема. Есть строковый литерал типа String, которая собирается из объекта File и является строковым представлением некого FilePath и представляет собой аттач к письму, посылаемому из Java - приложения (посредством javax.mail API).

Делаю так (т. е. из метода возвращается что то вроде):

return new String(attach.getFilename().getBytes("windows-1251"));

где attach.getFilename() возвращает просто String.

в письме аттач приходит с "квадратиками", если поставить другую кодировку - на месте русских символов - пустота. Все приложение работает в UTF-8. В какую сторону копать? Или по-другому представлять строку? Есть ли смысл пробовать StringBuffer или StringBuilder? Или во всем вообще виноват mail API?
К началу Посмотреть профиль Отправить личное сообщение
Skipy : 4801
Я тут живу!
Откуда: Москва, Россия

СообщениеНоя 24, 2010 11:24 
Ответить с цитатой
По-первых, почему Вы получаете из attach-а имя файла, считая, что это кодировка Cp1251?

Во-вторых, Зачем Вы эти байты тут же интерпретируете как UTF-8? Вы точно понимаете, что делаете?

В третьих. Возьмите из строки, которая "квадратиками", содержимое в виде char array и напишите тут.

Вот это еще почитайте: http://www.skipy.ru/technics/encodings.html
_________________
С уважением,
Евгений aka Skipy
www.skipy.ru
P.S. Я НЕ решаю задачи ЗА других!
К началу Посмотреть профиль Отправить личное сообщение Посетить сайт автора
matvey : 33
Новичок
Откуда: Novosibirsk

СообщениеНоя 24, 2010 13:04 
Ответить с цитатой
Skipy писал(а):
По-первых, почему Вы получаете из attach-а имя файла, считая, что это кодировка Cp1251?


Потому что файл создан в cp1251. Хотя, следует отметить, что аттачи на сервере сохраняются в разных кодировках. Скажем один файл отображается как ????, другой вообще кракозябрами. В таком случае - логичный вопрос: Раз кодировки файлов, все-таки, разные, как привести все к одной, чтобы аттач в письмо при посылке из приложения отображал название корректно?

Цитата:

Во-вторых, Зачем Вы эти байты тут же интерпретируете как UTF-8? Вы точно понимаете, что делаете?


Я пробую разные виды кодировок. При выставлении cp1251 в аттаче появляются "квадратики" при посылке письма. Если ставить UTF-8 при посылке то вообще валится на exception: FileNotFound, поскольку имя файла далее не распознается.

Цитата:

В третьих. Возьмите из строки, которая "квадратиками", содержимое в виде char array и напишите тут.


признаться, подумывал это сделать. Как руки дойдут - выложу.
К началу Посмотреть профиль Отправить личное сообщение
Skipy : 4801
Я тут живу!
Откуда: Москва, Россия

СообщениеНоя 24, 2010 13:36 
Ответить с цитатой
Вы отличайте, пожалуйста, кодировку файла и кодировку имени файла. У меня есть куча файлов в UTF-8, а имена у них в операционке записаны в Cp1251, ибо Win по-другому не умеет.

Итак. Давайте все-таки разбираться, где и что происходит. Когда Вы прикрепляете файл - это двоичные данные. О кодировке файла в этом случае речи вообще не идет, она не имеет права меняться. Другое дело, как в теле письма указано имя этого самого файла. Я достаточно давно работал в последний раз с Java Mail, так что не могу сказать, есть ли там возможность указания кодировки при присоединении файла. Для Subject-а есть, для тела тоже.

В любом случае от Вас сейчас нужны char-ы. Только по ним можно понять, сломалась ли кодировка, или же Вы просто не отображаете символы. Ну и код, которым Вы прикрепляете файл, тоже нужен.

P.S. А Все Ваши игры с кодировками могут дать результат по чистой случайности. И устойчивость этого результата не гарантируется.
_________________
С уважением,
Евгений aka Skipy
www.skipy.ru
P.S. Я НЕ решаю задачи ЗА других!
К началу Посмотреть профиль Отправить личное сообщение Посетить сайт автора
matvey : 33
Новичок
Откуда: Novosibirsk

СообщениеДек 02, 2010 14:05 
Ответить с цитатой
char-ы все вопросиками. То есть на месте русских символов кириллицы - ?????. Правда, я пишу в лог log4j.properties, посредством Logger, ибо System.out вряд ли куда - то приведет.

Разумеется, речь изначально шла об имени файла а не об его содержимом.

Код которым я прикрепляю файл? Это Atlassianовский плагин.

только кусок...
Код:
MimeBodyPart part = com.atlassian.mail.MailUtils.createAttachmentMimeBodyPart(getAbsolutePath(att));

...где getAbsolutePath(att) возвращает StringBuilder вида:

Код:
return new StringBuilder(attachmentBasePath).append(File.separator).append(pkey).append(File.separator).append(ikey).append(File.separator).append(att.getId()).append("_").append(att.getFilename()).toString();
К началу Посмотреть профиль Отправить личное сообщение
Skipy : 4801
Я тут живу!
Откуда: Москва, Россия

СообщениеДек 02, 2010 16:49 
Ответить с цитатой
matvey писал(а):
char-ы все вопросиками.


char - это число. Два байта. Оставьте вопросики, байты приведите.
_________________
С уважением,
Евгений aka Skipy
www.skipy.ru
P.S. Я НЕ решаю задачи ЗА других!
К началу Посмотреть профиль Отправить личное сообщение Посетить сайт автора
matvey : 33
Новичок
Откуда: Novosibirsk

СообщениеДек 02, 2010 19:10 
Ответить с цитатой
Я извиняюсь за ламерство, но так что ли?

Код:
char ch[] = filepath.toCharArray();

for (int i = 0; i < filepath.length(); i++) {
  System.out.println("" + (byte)ch[i]);
}
К началу Посмотреть профиль Отправить личное сообщение
Skipy : 4801
Я тут живу!
Откуда: Москва, Россия

СообщениеДек 03, 2010 10:07 
Ответить с цитатой
Код:
for (char c : filepath.toCharArray()) {
    System.out.print(getString(c >> 8));
    System.out.print(getString(c));
    System.out.println();
}


Код:
private static String getString(int c){
    String s = Integer.toHexString(c & 0xff).toUpperCase();
    return s.length() > 1 ? s : "0"+s;
}

_________________
С уважением,
Евгений aka Skipy
www.skipy.ru
P.S. Я НЕ решаю задачи ЗА других!
К началу Посмотреть профиль Отправить личное сообщение Посетить сайт автора
 
Начать новую тему  Ответить на тему
Страница 1 из 2
На страницу 1, 2  След.
Список форумов
 -> Локализация (l10n & i18n)


 
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах


Java and all Java-related trademarks and logos are trademarks or registered trademarks of Oracle Corporation in the United States and other countries.
Это сайт не относится к фирме Oracle Corporation и не поддерживается ею.

© 2006-2010 www.javatalks.ru: форум java программистов
Используется скрипт phpBB © 2001, 2010 phpBB Group

Хостинг от bizname.ru