forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   JAVA Micro Edition (http://forum.boolean.name/forumdisplay.php?f=52)
-   -   Сжать текст смс средствами J2me (http://forum.boolean.name/showthread.php?t=7252)

impersonalis 30.10.2008 20:07

Ответ: Сжать текст смс средствами J2me
 
Цитата:

То есть никакой универсальности, в общем, это очень неудобно.
Ну а ты как думал?
совет:http://forum.boolean.name/showpost.p...7&postcount=30

Phantom 30.10.2008 20:21

Ответ: Сжать текст смс средствами J2me
 
Нифига ничего не понял =(
В джаве нет прямого доступа к отправщику смс. Текст смс скармливать надо в любом случае в юникоде. И если в тексе символы позволяют быть закодированными семью битами, то телефон сам уже кодирует. То есть видимо я пытаюсь ESC символ скормить, но он не может быть в одиночку использован при семибитном кодировании, поэтому телефон решает, что нужно текст использовать в юникоде. Возможно, это ещё от телефона и/или джава машины зависит. Блин... Что же делать-то? Твой совет я нифига не понял =(

Phantom 31.10.2008 02:46

Ответ: Сжать текст смс средствами J2me
 
Сделал вместо ESC тильду. Первые тесты показали неплохой результат. Пример:
"Штиль - ветер молчит,
Упал белой чайкой на дно.
Штиль - наш корабль забыт,
Один в мире, скованном сном.

Между всех времён
Без имён и лиц
Мы уже не ждём,
Что проснётся бриз!"
Данный текст, набранный в смс, занимает три смс сообщения. А этот же текст, пропущенный через мою функцию выглядит примерно так:
"цa_$n,m0ΔTBPX0q5dΦk/r3їШXи)3Dl.@I#DlΞ$їC'7WyB"йЦYZaPш,Λ9@@%ЦXЖ@Πi5WxpB щlй0aи$uXDQїЎ
Ξ8eD&NΘЬС?Fйш_жЎHE+0ΦЈ& ~/p_#lΔ2ЈДи,Π!5?F~XL0ДщEXΣ¤ҐΞkцС_kмPЖDlиH§XйЈЈv"
И ВЛАЗИТ В ОДНО СМС!!!
Я мега крут!

Phantom 31.10.2008 02:49

Ответ: Сжать текст смс средствами J2me
 
Форум испаганил почему-то некоторые символы. Непонятно откуда появились всякие "ц", "Д", "ш", "ж"... Это я к тому, что моя функция выдаёт нормальные символы, которые не переключают смс-редактор в режим юникода, это всё баг форума. =)

impersonalis 31.10.2008 17:29

Ответ: Сжать текст смс средствами J2me
 
Так-так. Что придпримите далее?
*читаю, как начуно-популярный сериал смотрю - все серии*

Phantom 31.10.2008 18:04

Ответ: Сжать текст смс средствами J2me
 
Ой, ёлки, сколько спасибок поставили. Вы это погорячились. Я пока на PHP написал сам алгоритм, так как в нём много лучше ориентируюсь, чем в Java. Ещё предстоит довести до ума и портировать на Java. Так что ещё куча вопросов, наверно, возникнет. =)

Phantom 04.11.2008 03:45

Ответ: Сжать текст смс средствами J2me
 
Всё. Готово практически. Осталось пару строк в класс вписать! Вот только не знаю как это делается. Нужно в цикле пробежать строку посимвольно, получая код очередного символа. Из потока я умею побайтно читать, а вот как из строки посимвольно - не знаю.

Piligrim 04.11.2008 15:17

Ответ: Сжать текст смс средствами J2me
 
s.charAt(int)
а заменять удобно с помощью s.replace(char, char)

Phantom 04.11.2008 20:32

Ответ: Сжать текст смс средствами J2me
 
Сорри, я уже сделал, но забыл отписаться =) Только пока не работает как надо. Сейчас вот до ума довожу.

abcdef 24.12.2008 21:49

Ответ: Сжать текст смс средствами J2me
 
Phantom_wc - я когда-то делал аналогичный алгоритм, но в MIDletPascal, неохота переписывать на java,.. думаю получилось просто это можно взять за основу, и добавить в алгоритм кодирования обход недопустимых символов..
Код:

var
  buf : array[0..4096] of boolean;
  bit : array[0..7] of integer;
  max : integer;
  id_in,id_out,id_dec : integer;
  convCmd : command;


function ansiToUtf(s : string) : string;
var  {rus_ansi to UTF8}
  i,ch : integer;
begin
  for i := 0 to length(s)-1 do
  begin
    ch := ord(getChar(s,i)) and 255;
    if (ch>=192) then  s := setChar(s,chr(ch+848),i);
    if (ch=168)  then  s := setChar(s,chr($0401),i);
    if (ch=184)  then  s := setChar(s,chr($0451),i);
  end;
  ansiToUtf := s;
end;


function utfToAnsi(s : string) : string;
var  {UTF8 to rus_ansi}
  i,ch : integer;
begin
  for i := 0 to length(s)-1 do
  begin
    ch := ord(getChar(s,i));
    if (ch>255) then  s := setChar(s,chr(ch-848),i);
    if (ch=$0401) then  s := setChar(s,chr(168),i);
    if (ch=$0451) then  s := setChar(s,chr(184),i);
  end;
  utfToAnsi := s;
end;


procedure toBits(s : string; maxb : integer);
var
  i,j,b : integer;
begin
  max:=0;
  for i:=0 to 4096 do buf[i]:=false;
  for i:=0 to length(s)-1 do
  begin
    b:=ord(getChar(s,i));
    for j:= maxb{7} downto 0 do
    begin
      if (b and bit[j])<>0 then buf[max]:=true;
      max:=max+1;
    end;
  end;
end;


function fromBits(maxb : integer) : string;
var
  i,j,b : integer;
  s : string;
begin
  i:=0;
  s:='';
  while i<max do
  begin
    b:=0;
    j:=maxb;
    while (i<max) and (j>=0) do
    begin
      if buf[i] then b:=(b or bit[j]);
      i:=i+1;
      j:=j-1;
    end;
    s:=s+chr(b);
  end;
  fromBits:=s;
end;


begin
  bit[0]:=1;
  bit[1]:=2;
  bit[2]:=4;
  bit[3]:=8;
  bit[4]:=16;
  bit[5]:=32;
  bit[6]:=64;
  bit[7]:=128;
  showForm;
  id_in := formAddTextField('IN', 'Привет! это тестовая программка от arT (c). e-mail: [email protected]', 512, TF_ANY);
  convCmd := createCommand('next', CM_OK, 1);
  addCommand(convCmd);
  repeat delay(100); until getClickedCommand=convCmd;
  removeCommand(convCmd);
  //////
  toBits(utfToAnsi(formGetText(id_in)),7);
  id_out := formAddTextField('OUT', fromBits(6), 1024, TF_ANY);
  //////
  toBits(utfToAnsi(formGetText(id_out)),6);
  id_dec := formAddTextField('DECODE', ansiToUtf(fromBits(7)), 512, TF_ANY);
  repeat delay(100); until false;
end.


Phantom 25.12.2008 07:43

Ответ: Сжать текст смс средствами J2me
 
Ы. Да я уже сделал =) Совсем забыл, что у меня тут тема есть на эту тему =) Оказалось в итоге, что зря я мучился, биллинг запретил отправку смс с подменой номера :-(


Часовой пояс GMT +4, время: 16:08.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot