powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / кодировки русских букв
9 сообщений из 9, страница 1 из 1
кодировки русских букв
    #38360915
Lihman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте!

Помогите, плиз разобраться, ибо уже в конец запутался.
Итак: есть 2 сервера передающие друг другу данные при помощи GET/POST
с моей стороны есть java (utf-8) - с той стороны ??? (koi8-r)

как я понимаю, все String в Java хранятся в UTF-8
я формирую строку в которой "DATA=test"
Код: java
1.
String dataEnc = data.toString();


Потом подписываю эти данные через Signature
Код: java
1.
byte[] sign = AbstractRequest.getSignBytes(dataEnc, signature);


и формирую строку для отправки
Код: java
1.
2.
3.
data = new StringBuffer();
data.append("request=").append(URLEncoder.encode(dataEnc, "ASCII"));
data.append("&sign=").append(URLEncoder.encode(new String(Base64.encodeBase64(sign), "ASCII")));



вот все так работало, до тех пор пока не понадобилось передать русские буквы
"DATA=тест"

если оставить как есть, то DATA%3D%3F%3F%3F%3F
т.е. DATA=???? - так расшифровывает сервер на той стороне,
и при этом подпись нормальная!

если делать
Код: java
1.
2.
3.
data = new StringBuffer();
data.append("request=").append(URLEncoder.encode(dataEnc, "KOI8_R"));
data.append("&sign=").append(URLEncoder.encode(new String(Base64.encodeBase64(sign), "KOI8_R")));


то после URLEncode получается правильное DATA%3D%D4%C5%D3%D4
но подпись не получается, второй сервер отвечает:
Код: xml
1.
<error code="1">Invalid SHA1 signature</error>



если начинать менять кодировку тут
Код: java
1.
String dataEnc = data.toString();


то тогда даже в URLEncode получается непонятно что.

Может кто сталкивался с таким?
Может есть хоть какие-то идеи?
Буду рад любым идеям!

Заранее спасибо!
...
Рейтинг: 0 / 0
кодировки русских букв
    #38360935
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lihmanкак я понимаю, все String в Java хранятся в UTF-8

Это показывает принципиальное непонимание процесса кодировки строк. Совершенно не важно как String хранится в Java.
String содержит Unicode символы. Но это не конкретная кодировка. Это лишь алфавит.
UTF-8, ASCII, KOI8-R это уже кодировки. Они указывают то как именно String представлен в виде байт.

Проблема в том что внутри метода
AbstractRequest.getSignBytes(dataEnc, signature);
Вы где-то преобразуете dataEnc в byte[], используя текущую системную кодировку: System.getProperty("file.encoding")
А потом говорите что полученая подпись она для байтов полученых уже как KOI8_R текущей строки. Вот и не совпадает.

В качестве теста, попробуйте запустить программу с ключом -Dfile.encoding=KOI8-R
...
Рейтинг: 0 / 0
кодировки русских букв
    #38360984
Lihman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да я и не настаиваю, что я все знаю! .... я только пытаюсь постичь

вот собственно сама функция подписи
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
    public static byte[] getSignBytes(String line, Signature signature) {
        byte[] result = null;

        try {
            signature.update(line.getBytes());
            result = signature.sign();
        } catch (Exception e) {
            log.error(e.getMessage(), e);
        }
        return result;
    }
...
Рейтинг: 0 / 0
кодировки русских букв
    #38361022
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
line.getBytes() эквиваленте line.getBytes(Charset.defaultCharset().name())
Здесь вы получаете байте в текущей кодировке и создаёте для этих байт подпись.
Ваша текущая кодировка не KOI-8r, поэтому когда вы говорите серверу, что вот вам строка закодированая в HEX байты а вот для неё подпись, то логично, что подпись не подходит, так как она была создана для других байт.
Можете попробовать как вариант и такой код:
signature.update(line.getBytes("KOI8-R"));
...
Рейтинг: 0 / 0
кодировки русских букв
    #38361025
Lihman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да, спасибо, что ткнули носом!!
Уже вроде как получилось!!!
...
Рейтинг: 0 / 0
кодировки русских букв
    #38361028
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LihmanДа я и не настаиваю, что я все знаю!
Я говорю о ключевом моменте к понимаю кодировок. Не надо знать "всё". Нужно понимание.
Когда вы осознаете что "кодировка" это то как именно "строка(абстрактный текст)" представлена в виде "байт(кокретные двоичные данные)", то проблемы кодировок, для вас перестанут существовать.
...
Рейтинг: 0 / 0
кодировки русских букв
    #38361046
Lihman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Видать еще не дорос до такого :)
...
Рейтинг: 0 / 0
кодировки русских букв
    #38361056
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LihmanВидать еще не дорос до такого :)
Сам удивляюсь, как такая простая тема, порой вызывает столько недопонимания. Тоже несколько лет для меня кодировки были каким-то туманным миром загадок. А потом когда осознал чем именно они являются, все проблемы пропали.
...
Рейтинг: 0 / 0
кодировки русских букв
    #38361084
Lihman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Та да, книжек начитаешься - и еще больше с толку сбивают!
Уже 3й раз пытаюсь понять Spring - и все никак :(

Не хватает именно, чтобы рассказали человеческим языком!
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / кодировки русских букв
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]