|
Java форум JavaTalks форум программистов
|
|
|
|
| Предыдущая тема :: Следующая тема |
| Автор |
Сообщение |
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 |
|
|
Спасибо, с проблемой уже разобрался, если интересно, могу кинуть кусок кода |
|
|
|
 |
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) |
|
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете голосовать в опросах
|
|