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

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
 byte  a[] = "string".getBytes();
...
...
какието манипуляции над a[]
..
..
здесь нужно поменять кодировку.

как можно поменять кодировку у массива, без перевода его в строку обратно.??
...
Рейтинг: 0 / 0
изменение кодировки
    #34555510
ТимоН
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторкак можно поменять кодировку у массива, без перевода его в строку обратно.??
мммм у byte нет кодировки!!!
...
Рейтинг: 0 / 0
изменение кодировки
    #34555519
denissh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
во как....

а как быть, мне текст надо сжать в 7 бит и передать его в соответствующей кодировке (похожая на ASCII)...если использовать строки, то там некоторые символы при сжатии не правильно воспринимаются
...
Рейтинг: 0 / 0
изменение кодировки
    #34555542
ТимоН
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
или неправильно читаете или неправильно пишете, код покажете
...
Рейтинг: 0 / 0
изменение кодировки
    #34555706
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ТимоНмммм у byte нет кодировки!!!
Это у String нет кодировки. А byte[] это представление строки в какой-либо кодировке.
...
Рейтинг: 0 / 0
изменение кодировки
    #34555722
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
denisshкак можно поменять кодировку у массива, без перевода его в строку обратно.??
InputStreamReader + OutputStreamWriter
...
Рейтинг: 0 / 0
изменение кодировки
    #34555731
ТимоН
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторНадо чётко разделять понятия символов и байтов — иначе непонимание и проблемы гарантированны.

Java практически с самого своего рождения использует для кодирования символов стандарт Unicode. Библиотечные функции Java ожидают увидеть в переменных типа char символы, представленные кодами Unicode. В принципе, Вы, конечно, можете запихнуть туда что угодно — цифры есть цифры, процессор всё стерпит, но при любой обработке библиотечные функции будут действовать исходя из предположения что им передали кодировку Unicode. Так что можно спокойно полагать, что у типа char кодировка зафиксирована. Но это внутри JVM. Когда данные читаются извне или передаются наружу, то они могут быть представлены только одним типом - типом byte. Все прочие типы конструируются из байтов в зависимости от используемого формата данных. Вот тут то на сцену и выходят кодировки — в Java это просто формат данных для передачи символов, который используется для формирования данных типа char. Для каждой кодовой страницы в библиотеке имеется по 2 класса перекодировки (ByteToChar и CharToByte). Классы эти лежат в пакете sun.io. Если, при перекодировке из char в byte не было найдено соответствующего символа, он заменяется на символ ?.

отсюда
http://www.jug.ru/servlets/index?page=rus#8bits
...
Рейтинг: 0 / 0
изменение кодировки
    #34555746
ТимоН
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторЭто у String нет кодировки. А byte[] это представление строки в какой-либо кодировке.
byte[] - всегда в unicode
...
Рейтинг: 0 / 0
изменение кодировки
    #34555980
Kachalov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ТимоНмммм у byte нет кодировки!!!

ТимоН авторЭто у String нет кодировки. А byte[] это представление строки в какой-либо кодировке.
byte[] - всегда в unicode
- ну Вы даете! :) или я нчего не понял :(

массив типа byte[] содержит числа типа byte (они по определению не имеют кодировки, так же как int или long)

Unicode имеет длину кода 2 байта

при конвертации строки в байтовый массив "текст".getBytes() происходит конвертация кодов (в однобайтовую кодировку ISO-8859-1), а если указать кодировку явно: "текст".getBytes("кодировка"), можно получить массив байтов для нужной кодировки
...
Рейтинг: 0 / 0
изменение кодировки
    #34556003
ТимоН
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
автор- ну Вы даете! :) или я нчего не понял :(
я имел ввиду как раз
авторпри конвертации строки в байтовый массив "текст".getBytes() происходит конвертация кодов (в однобайтовую кодировку ISO-8859-1),
...
Рейтинг: 0 / 0
изменение кодировки
    #34556124
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ТимоН
я имел ввиду как раз
авторпри конвертации строки в байтовый массив "текст".getBytes() происходит конвертация кодов (в однобайтовую кодировку ISO-8859-1),

ISO-8859-1 не Unicode
...
Рейтинг: 0 / 0
изменение кодировки
    #34556128
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ТимоНbyte[] - всегда в unicode
то есть уже какая-то кодировочка появилась?
...
Рейтинг: 0 / 0
изменение кодировки
    #34556133
ТимоН
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
:)

Т.е.
"строка в любой кодировке".getBytes() - всегда юникод
...
Рейтинг: 0 / 0
изменение кодировки
    #34556137
ТимоН
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторISO-8859-1 не Unicode
Почти: В Юникоде первые 256 кодовых позиций совпадают с ISO-8859-1.
...
Рейтинг: 0 / 0
изменение кодировки
    #34556139
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ТимоН"строка в любой кодировке".getBytes() - всегда юникод

"строка в любой кодировке"... приплыли. У меня сразу ряд вопросов.
1) У меня есть String s = "строка", как мне узнать её кодировку?
2) У меня есть String s = "строка", после ответа на первый вопрос оказалось что она всегда в кодировке ZZZ. Вопрос, как мне получить String s2 в другой кодировке?
...
Рейтинг: 0 / 0
изменение кодировки
    #34556141
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ТимоН
Почти: В Юникоде первые 256 кодовых позиций совпадают с ISO-8859-1.
Оки-доки, босс. Следуя этой логикой, если у ASCII первые 128 позиций совпадают с ISO-8859-1, то ASCII тоже Unicode?
...
Рейтинг: 0 / 0
изменение кодировки
    #34556151
ТимоН
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1. строка String str = "строка" - юникод, узнавать ничего ненадо
2. http://www.jug.ru/servlets/index?page=rus#recode
...
Рейтинг: 0 / 0
изменение кодировки
    #34556155
ТимоН
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторОки-доки, босс. Следуя этой логикой, если у ASCII первые 128 позиций совпадают с ISO-8859-1, то ASCII тоже Unicode? ок, ладно. Вы правы.
...
Рейтинг: 0 / 0
изменение кодировки
    #34556168
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ТимоН1. строка String str = "строка" - юникод, узнавать ничего ненадо
Ты сам написал выше "строка в любой кодировке". Вот было интересно что такое кодировка по отношению к строке, которая представлена экземпляром класса String. Теперь, как я и ожидал, ты пишешь что строка всегда Unicode. Выходит Unicode и "любая кодировка" одно и то же, либо ты сам себе противоречишь.

ТимоН2. http://www.jug.ru/servlets/index?page=rus#recode
Не надо мне ссылок на всякие глупости, как и куда переганять байты я себе прекрасно представляю. А то что строка может показывать не то что хочется не есть призрак её не верной кодировки. Это признак того что byte[] был интерпретирован не правильно. То есть при его декодировании была подставлена не его кодировка.
...
Рейтинг: 0 / 0
изменение кодировки
    #34556180
ТимоН
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторТы сам написал выше "строка в любой кодировке". Вот было интересно что такое кодировка по отношению к строке, которая представлена экземпляром класса String. Теперь, как я и ожидал, ты пишешь что строка всегда Unicode. Выходит Unicode и "любая кодировка" одно и то же, либо ты сам себе противоречишь.

Ок. Видимо жара :)

Объясню на примере, что я имел ввиду. Какие бы вы данные нехранили в String в JVM они всегда unicode. Т.е. если вы не указали кодировку при чтении(к примеру) из файла (какой бы она небыла), то ваши данные считаются неверно. JVM ждет от вас unicode или указанную вами.
...
Рейтинг: 0 / 0
изменение кодировки
    #34556612
denissh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
всем привет...

есть некоторый текст, вот его дамп
56 65 72 6e 6f 2e 20 54 76
6f 6a 20 72 65 6a 74 69 6e 67 20 20 2d 20 32 31
2c 20 75 20 6c 69 64 65 72 61 20 2d 20 25 6c 65
61 64 65 72 5f 6d 61 72 6b 25 2e 20 0d 0a 50 6f
20 6e 61 72 6f 64 6e 6f 6a 20 70 72 69 6d 65 74
65 20 2d 20 65 73 6c 69 20 6e 65 76 65 73 74 61
20 63 68 69 68 61 65 74 20 75 74 72 6f 6d 20 6e
61 6b 61 6e 75 6e 65 20 73 76 61 64 20 62 79 2c
20 6f 6e 61 20 76 20 7a 61 6d 75

затем я его кодирую в 7 бит и получается

ac65 b9fb ed02 51ed 6f35
485e 56d3 d3ee 3308 d402 c962 2c50 1dc4
4e93 cbf2 30a8 052a b1cb 6172 59fe 6d87
e5eb 920b d450 40df 2077 58fe 26bb df6a
105c 9e6e 97e9 6550 0b54 9eb3 d320 77d9
5e9e d3c3 a031 3a8d 0e97 e9a0 3a5d fe6e
83dc e175 d85d 7797 4173 7b98 0c12 e759
a0b7 3b0c b283 f4e1 761d



затем я его отправляю по сети....и оно приходит в таком виде
3f 65 3f 3f 3f 02 51 3f 6f 35
48 5e 56 3f 3f 3f 33 08 3f 02 3f 62 2c 50 1d 3f
4e 3f 3f 3f 30 3f 05 2a 3f 3f 61 72 59 3f 6d 3f
3f 3f 3f 0b 3f 50 40 3f 20 77 58 3f 26 3f 3f 6a
10 5c 3f 6e 3f 3f 65 50 0b 54 3f 3f 3f 20 77 3f
5e 3f 3f 3f 3f 31 3a 3f 0e 3f 3f 3f 3a 5d 3f 6e
3f 3f 3f 75 3f 5d 77 3f 41 73 7b 3f 0c 12 3f 59
3f 3f 3b 0c 3f 3f 3f 3f 76 1d



т.е. некоторые символы заменяются на 3F...т.е. на знак вопроса


сообщение я формирую следующим образом:

Код: plaintext
1.
2.
3.
4.
ByteBuffer msg= new  ByteBuffer(); 
msg.appendBytes(TEXT.getBytes()); 
msg =  new  ByteBuffer(pack(msg.getBuffer()));   //кодирую в 7 бит
setMessage( new  String(msg.getBuffer()), ASCII);
вот....
...
Рейтинг: 0 / 0
изменение кодировки
    #34556707
y3u
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
setMessage(new String(msg.getBuffer()), ASCII);

если в недрах этого метода не выполняется взяте байт от юникодной строки в аскишной кодировке, а просто ставится хидер, то, естественно, это не будет работать правильно...

ПыСЫ
а нафига ты его кодируешь в 7 бит? Нельзя чтоли сразу нужные байты получить?
...
Рейтинг: 0 / 0
изменение кодировки
    #34556743
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И правда, а зачем ты после перекодирования опять new String делаешь? Твои байты уже не верно декодированы, и потом неверно декодированая строка передается в сообщении? В чем был глубинный смысл кодирования в 7 бит, если посылается обычная строка?
...
Рейтинг: 0 / 0
изменение кодировки
    #34557166
denissh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
в 7 бит кодировать - это для того чтобы в пакет, который передается по сети поместилось больше данных. На другом конце пакет принимают, и данные декодируют....кодировать нужно только латинские символы, т.е. первые 128...все остальные отправлять обычно (7 бит - это стандартная кодировка в GSM сети)

а в метод я кладу строку, потомучто реализация у библиотеки такая, только строку можно давать
Код: plaintext
1.
setMessage(String msg, String encoding);

можно конечно поковыряться в самой библиотеки и сделать метод для принятия массива байт,....
но это не 10 минут.......
да и я не понимаю, что это может изменить?
перевод в строку както неверно происходит?
...
Рейтинг: 0 / 0
изменение кодировки
    #34557274
y3u
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну раз так, то толку от твоего кодирования никакого нету, т.к. у тебя все равно строка в юникоде. Какую ты делаешь кодировку лучше скажи, и вообще, клади компилирующийся рабочий код, посмотрим, что можно сделать
...
Рейтинг: 0 / 0
изменение кодировки
    #34557464
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Когда ты делаешь new String(msg.getBuffer()), - подставляется кодировка по умолчанию. То есть твой 7ми битный текст парсится как ISO-8859-1. Отсюда такая кривого вида строка.

Так как единственный доступный метод у тебя
setMessage(string, encoding);
Подозреваю что придется регистрировать свой charset.
http://forum.java.sun.com/thread.jspa?tstart=0&forumID=31&threadID=504392&trange=15

Хотя захачить либу, ИМХО, проще.
...
Рейтинг: 0 / 0
изменение кодировки
    #34557807
denissh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
y3u, весь код положить не могу, он довольно большой, СМС платформа, работа по smpp протоколу...она полностью работает, но сообщения в латинице приходиться отправлять в юникоде размером в 60 символов, что не есть рационально (это только для русского языка)...серверное приложение поддерживает только 16 бит и 7 бит...Сообщение кодированное в 7 бит не читаемо, до распаковки его обратно в 8 бит.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
   private   byte [] pack( byte [] unpacked)
  {
     int  packedLen = unpacked.length - (unpacked.length /  8 );
     byte [] packed =  new   byte [packedLen];
     int  pos =  0 ;

     int  i =  0 ;
     while  (i < unpacked.length)
    {
       int  jmax = (i +  7 ) > unpacked.length ? unpacked.length - i :  7 ;
       int  mask = 0x1;
       for  ( int  j =  0 ; j < jmax; j++)
      {
         int  b1 = ( int )unpacked[i + j] & 0xff;
         int  b2 = 0x0;
         try 
        {
          b2 = ( int )unpacked[i + j +  1 ] & mask;
        }
         catch  (ArrayIndexOutOfBoundsException x)
        {
        }

        packed[pos++] = ( byte )((b1 >>> j) | (b2 << ( 8  - (j +  1 ))));
        mask = (mask <<  1 ) |  1 ;
      }

      i +=  8 ;
    }

     return  (packed);
  }

вот функция упаковки, она работает правильно
при перевода массива байт в строку происходит
есть и кодовая таблица, но я вот не знаю как ее присобачить
...
Рейтинг: 0 / 0
изменение кодировки
    #34557816
denissh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowicz, есть и CharsetProvider, можешь подсказать как зарегистрировать ее, и воспользоваться....а то по ссылке показано только как создать
...
Рейтинг: 0 / 0
изменение кодировки
    #34557897
Фотография Penkov Vladimir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На Tue, 29 May 07 10:41:20 GMT
"denissh" <nospam@sql.ru>; записано:

> y3u, весь код положить не могу, он довольно большой, СМС платформа,
> работа по smpp протоколу...

видимо все через это прошли... :)
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
изменение кодировки
    #34557930
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
denisshBlazkowicz, есть и CharsetProvider, можешь подсказать как зарегистрировать ее, и воспользоваться....а то по ссылке показано только как создать

В доке к классу CharsetProvider все написано.
Можно взять
1.5.x_xx\jre\lib\charsets.jar в качестве примера.
...
Рейтинг: 0 / 0
30 сообщений из 30, показаны все 2 страниц
Форумы / Java [игнор отключен] [закрыт для гостей] / изменение кодировки
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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