Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java ME (J2ME) > Как передавать русские символы по сети без Unicode


Автор: maks991 8.8.2010, 08:44
Значит, проблема такая. Пишу я болталку, чатик такой скромный. И нужно, конечно же, передавать сообщения, которые содержат русские символы. Так вот, очень хочется сократить количество передаваемых байтов, потому что русские символы в юникоде занимают аж 2 байта!
Принимаю сообщения я так:
Код

final int length = in.readInt();
final byte[] bytes = new byte[length];
int totalBytes = 0, currentBytes;
do
{
    currentBytes = in.read(bytes, totalBytes, length-totalBytes);
    totalBytes += currentBytes;
}
while (totalBytes < length);
String message = new String(bytes, "UTF-8");

А передаю вот так:
Код

String message = Message.makeMessage(type, nick, text);
byte[] b = message.getBytes("UTF-8");
out.writeInt(b.length);
out.write(b);
out.flush();

В общем, как видите, приходится использовать UTF-8, чтобы передавать русские символы и не получать на входе абракадабру. Но меня не устраивают эти 2 байта на символ. Помогите, пожалуйста, решить данную проблему...
Может быть, какую-то другую кодировку использовать, или хитрое что-то...я так и не смог осилить. Пытался вместо UTF-8 написать ASCII, думая, что таблица будет локальной и всё хорошо будет, но это не помогло...в телефоне отобразились квадратики вместо букв :(
В общем, такая вот проблема. Заранее спасибо за помощь.

Добавлено через 2 минуты и 10 секунд
Ну то есть очень бы хотелось, чтобы на русский символ приходился тот же 1 байт, как и на латинский. Если что, чат этот будет для двоих smile Телефоны у обоих Nokia, если это как-то влияет.

Автор: sanboll 8.8.2010, 09:13
Чат через bluetooth или через http?
Можно использовать DataOutputStream.writeUTF(String UTF) и DataInputStream.readUTF() - там и размер данных указывать не придется

Автор: maks991 8.8.2010, 10:05
Через StreamConnection. Я сокетами делаю. Ну да, знаю про эти методы. Но ведь количество передаваемых байтов всё равно не уменьшится :( Или уменьшится?

Добавлено через 12 минут и 53 секунды
Так-то есть аська...но я потому и делаю свою болталку, чтобы избавиться от всего лишнего, что мне в ней не нужно. И хочется уменьшить траффик, а то за счёт юникода не такой он маленький...

Автор: cutwater 8.8.2010, 10:20
maks991, откройте для себя сжатие данных. Вас пугает два байта на символ? Вы уверены что это настолько критично в условиях современного мира. На дворе 2010 год.

Добавлено через 2 минуты и 20 секунд
Цитата(maks991 @  8.8.2010,  07:44 Найти цитируемый пост)
 Телефоны у обоих Nokia, если это как-то влияет. 


О мобильных устройствах сначала не приметил. Приношу извинения.
В принципе если вам кроме кирилицы и латиницы ничего не нужно, кодируйте однобайтными кодировками, CP1251 (Windows-1251) или KOI8-R, хотя как под мобильными устройствами дела обстоят с кодировками боюсь не осведомлен.

Автор: maks991 8.8.2010, 10:59
Вот, и я про то же... Тоже думал использовать эти кодировки, но как-то не выходит :( Вот cp1251 должна быть прям точно, но как её пользовать правильно, не понимаю :(

Автор: maks991 8.8.2010, 12:23
Вот мне, действительно, только кириллица и латиница нужна...явно можно обойтись одним байтом на символ... Попробовал вместо UTF-8 написать Cp1251, вообще не сработало.

Автор: cutwater 8.8.2010, 12:34
maks991, string.getBytes("Cp1251") не?

Автор: maks991 8.8.2010, 12:38
Нет, не сработало :(

Добавлено через 1 минуту и 46 секунд
На телефоне русский язык ведь полностью поддерживается...неужели только Unicode... Хотя вроде да, на некоторых моделях нет цп1251, только утф

Добавлено через 2 минуты и 20 секунд
Может как-то можно из юникода перевести в цп и обратно?

Добавлено через 3 минуты и 22 секунды
Правда для телефонов желательно поменьше всяких этих сложных преобразований, ресурсы-то ограниченные всё же

Автор: maks991 8.8.2010, 16:08
Всё, товарищи, проблема решена. Причём решена тупейшим образом smile Сделал свою кодовую таблицу, где каждому символу приписал номерок и всё smile При отправке сообщения перевожу каждый юникодный символ в байт, согласно моей табличке, а при приёме обратно smile
Всем, кто пытался помочь, спасибо!

Автор: ivanovpv 8.8.2010, 19:59
Цитата(maks991 @  8.8.2010,  17:08 Найти цитируемый пост)
Сделал свою кодовую таблицу, где каждому символу приписал номерок и всё

Ага вот так и плодятся кодовые страницы. Глядишь и появится своя кодовая страница и будем мы писать:
Код

 string.getBytes("CP-MAKS991");


Автор: maks991 9.8.2010, 07:04
Хаха, ну smile Ну тут пришлось просто...без этого нельзя smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)